AXV

Loyihani yakunlash

Loyiha strukturasi, settings (.env), exception handler, CORS, Swagger/ReDoc hujjati, testlar, alembic upgrade

10-sinfAdvanced Python Back-end6-hafta · 17-dars

Bugun nimalarni o'rganamiz?

Struktura va sozlamalar

Settings va .env

Xatolar va CORS

Bir xil format

Hujjat, test, migratsiya

Yakuniy tekshiruv

Takrorlash

Fayl hajmi chegaradan oshsa qaysi status?

413 — Payload Too Large.
01

Struktura va sozlamalar

Settings va .env

Sozlamalar yo'li

.env Settings settings.x Ilova Kod o'zgarmaydi, .env o'zgaradi

Settings sinfi


from pydantic_settings import BaseSettings, SettingsConfigDict


class Settings(BaseSettings):
    app_name: str = "Book API"
    debug: bool = False
    database_url: str = "sqlite+aiosqlite:///./dev.db"
    cors_origins: list[str] = ["http://localhost:3000"]

    model_config = SettingsConfigDict(env_file=".env")


settings = Settings()
  
.env da DEBUG=true yoki CORS_ORIGINS=["https://sayt.uz"] kabi yoziladi. Maxfiy qiymatlar kodda va GitHub da bo'lmasin.

Mini-test

.env fayli GitHub ga yuboriladimi?

Maxfiy qiymatlar repozitoriyga tushmasligi kerak.
02

Xatolar va CORS

Bir xil format

Xato javobi

Xato yuz berdi Handler Bir xil JSON Frontend Format hamma joyda bir xil

Handler va CORS


app.add_middleware(
    CORSMiddleware,
    allow_origins=settings.cors_origins,
    allow_methods=["*"],
    allow_headers=["*"],
)

@app.exception_handler(HTTPException)
async def http_error(request: Request, exc: HTTPException):
    return JSONResponse(
        status_code=exc.status_code,
        content={"error": {"status": exc.status_code, "message": exc.detail}},
    )
  
Validatsiya xatosi uchun ham (RequestValidationError) shunday handler yozing va 422 qaytaring.

Mini-test

CORS nima uchun kerak?

Brauzer boshqa origin so'rovlarini cheklaydi, CORS ruxsat beradi.
03

Hujjat, test, migratsiya

Yakuniy tekshiruv

Yakuniy tekshiruv

pytest alembicupgrade head /docstekshiruvi README Hammasi yashil bo'lsa, loyiha tayyor

Testlar


from fastapi.testclient import TestClient
from app.main import app

client = TestClient(app)


def test_health():
    r = client.get("/health")
    assert r.status_code == 200
    assert r.json() == {"status": "ok"}


def test_not_found_format():
    r = client.get("/books/5")
    assert r.status_code == 404
    assert r.json()["error"]["message"] == "Kitob topilmadi"
  
Terminalda pytest -q va alembic upgrade head. alembic current joriy migratsiyani ko'rsatadi.

Mini-test

alembic upgrade head nima qiladi?

Barcha migratsiyalarni oxirigacha qo'llaydi.

Kod ichida va .env da sozlama

Kod ichida

Parol repozitoriyga tushadi, muhit almashtirish qiyin
VS

.env

Maxfiy, muhitga mos, .env.example bilan

Sozlamalarni doim .env da saqlang.

Atamalar. Bosing

Settings

bosing

Sozlamalarni .env dan o'quvchi sinf

CORS

bosing

Boshqa manzildan so'rovga ruxsat siyosati

exception handler

bosing

Xatoni bir xil javobga aylantiruvchi funksiya

alembic

bosing

Baza migratsiyalari vositasi

Loyihani yakunlash

1. Tartiblang

Struktura va Settings.

2. Mustahkamlang

Xato formati va CORS.

3. Tekshiring

pytest va alembic.

Yakuniy checklist

TekshiruvBuyruq yoki joyNatija
Testlarpytest -qhammasi yashil
Migratsiyaalembic upgrade headxatosiz
Hujjat/docs, /redocto'g'ri tavsif
Maxfiylik.gitignore.env yo'q
READMEishga tushirishyo'riqnoma bor

Pastga bosing: checklist

Settings qo'shish

  1. pip install pydantic-settings ni bajaring.
  2. Settings sinfini yozing va .env yarating.
  3. settings.database_url ni bazani ulashda ishlating.

Maxfiylik xatosi


SECRET = "abc123"
  

Maxfiylik xatosi


SECRET = settings.secret_key
  

Yakuniy loyiha raqamlarda

0
ta xato: HTTPException, validatsiya, umumiy
0
ta test: health, 404, 422
0
ta komanda: alembic upgrade head

Yakunlash — kod ishlaydi va boshqalar uni ishga tushira oladi.

Amaliy topshiriq 20 daqiqa

OsonSettings: app_name va debug maydonli Settings yozing.
Oson.env.example: Maxfiy qiymatsiz .env.example namunasini yozing.
O'rtaHandler: 404 xatosini {"error": ...} formatida qaytaring.
O'rtaCORS: Faqat http://localhost:3000 ga ruxsat bering.
QiyinTest: /health uchun test yozing.
BonusHujjat: Swagger da endpointlarni tags bilan guruhlang.

Dars xulosasi

Sozlamalar

.env va Settings; GitHub ga yubormang.

Xato va CORS

Bir xil JSON, kerakli origin lar.

Tekshiruv

pytest, alembic upgrade head, Swagger.

Uyga vazifa: Loyihani yakunlash.

Keyingi dars: Docker orqali deploy

Dockerfile va compose

6-hafta · 18-dars