CRUD, Book modeli, Pydantic sxemalar, Field cheklovlari, POST, GET, PUT/PATCH, DELETE, HTTPException, Form
10-sinfAdvanced Python Back-end5-hafta · 14-darsBook, Field, validatsiya
POST va GET
PATCH, DELETE, 403
Himoyalangan endpointga qaysi dependency foydalanuvchini beradi?
Depends(get_current_user) tokenni tekshirib User qaytaradi.Book, Field, validatsiya
class Book(Base):
__tablename__ = "books"
id: Mapped[uuid.UUID] = mapped_column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
title: Mapped[str] = mapped_column(String(200))
author: Mapped[str | None] = mapped_column(String(120))
pages: Mapped[int | None]
owner_id: Mapped[uuid.UUID] = mapped_column(ForeignKey("users.id", ondelete="CASCADE"))
class BookCreate(BaseModel):
title: str = Field(min_length=2, max_length=200)
author: str | None = Field(default=None, max_length=120)
pages: int | None = Field(default=None, gt=0, le=5000)
class BookRead(BookCreate):
model_config = ConfigDict(from_attributes=True)
id: uuid.UUID
gt — kattaroq, le — kichik yoki teng. pages=-5 yuborilsa FastAPI avtomatik 422 Unprocessable Entity qaytaradi, bazaga bormaydi.BookCreate sxemasida nega id yo'q?
id yubormaydi: UUID ni model default=uuid4 bilan beradi.POST va GET
@router.post("/", response_model=BookRead, status_code=201)
async def create_book(data: BookCreate, db: AsyncSession = Depends(get_db),
user: User = Depends(get_current_user)):
book = Book(**data.model_dump(), owner_id=user.id)
db.add(book)
await db.commit()
await db.refresh(book)
return book
@router.get("/", response_model=list[BookRead])
async def list_books(db: AsyncSession = Depends(get_db)):
return (await db.scalars(select(Book))).all()
@router.get("/{book_id}", response_model=BookRead)
async def get_book(book_id: uuid.UUID, db: AsyncSession = Depends(get_db)):
book = await db.get(Book, book_id)
if book is None:
raise HTTPException(404, "Kitob topilmadi")
return book
db.refresh(book) bo'lmasa, commit dan keyin bazada yaratilgan maydonlar (created_at) javobda eskirgan bo'lishi mumkin.Muvaffaqiyatli yaratilgan resurs uchun odatiy status kodi?
201.PATCH, DELETE, 403
@router.patch("/{book_id}", response_model=BookRead)
async def update_book(book_id: uuid.UUID, data: BookUpdate,
db: AsyncSession = Depends(get_db),
user: User = Depends(get_current_user)):
book = await db.get(Book, book_id)
if book is None:
raise HTTPException(404, "Kitob topilmadi")
if book.owner_id != user.id:
raise HTTPException(403, "Bu kitob sizniki emas")
for key, value in data.model_dump(exclude_unset=True).items():
setattr(book, key, value)
await db.commit()
await db.refresh(book)
return book
DELETE uchun status_code=204 qo'yish va await db.delete(book) dan keyin commit qilish odatiy. Avval topmasdan o'chirish noto'g'ri: 404 ni qaytara olmaysiz.Faqat yuborilgan maydonlarni yangilash uchun nima ishlatiladi?
exclude_unset=True yuborilmagan maydonlarni tashlab yuboradi.exclude_unset=True)Qisman yangilash uchun PATCH qulayroq.
Create, Read, Update, Delete
Yaratildi / mazmunsiz javob (o'chirildi)
Pydantic validatsiya xatosi
FastAPI da xato javobini qaytarish
Book, BookCreate, BookRead.
POST, GET, PATCH, DELETE.
Swagger /docs da har birini sinang.
| Amal | HTTP | SQL |
|---|---|---|
| Create | POST | INSERT |
| Read | GET | SELECT |
| Update | PUT / PATCH | UPDATE |
| Delete | DELETE | DELETE |
Pastga bosing: Swagger da sinash
Authorize bilan kiring, POST /books ni bajaring (201).GET /books va GET /books/{id} bilan o'qing.PATCH va DELETE ni sinab, boshqa egada 403 oling.
book.title = data.title
for key, value in data.model_dump(exclude_unset=True).items():
setattr(book, key, value)
Har amal uchun to'g'ri status kod muhim.
POST /books endpointini yozing (egasi joriy foydalanuvchi, status 201).DELETE /books/{id} ni yozing: 404, egasi bo'lmasa 403, muvaffaqiyatda 204.POST, GET, PUT/PATCH, DELETE.
Model — baza, sxema — kirish va chiqish.
404 topilmadi, 403 ruxsat yo'q, 422 validatsiya.
Uyga vazifa: Book CRUD va egalik tekshiruvi.
Query parametrlar, ilike, order_by, pagination
5-hafta · 15-dars