IlmHamroh
Python kursi/Web backend FastAPI3/16-dars16 daqiqa
Mundarija (22)

20.3-dars: FastAPI kirish

20-QISM — WEB-BACKEND (FastAPI) · 3-dars


1. Kirish va motivatsiya

HTTP 20.1-bob va REST 20.2-bob ni o'rgandik — endi ulardan haqiqiy veb-ilova quramiz. FastAPI — zamonaviy, tez Python veb-framework: bir necha qator kod bilan REST API yaratasiz, va u avtomatik hujjat, validatsiya va yuqori tezlik beradi. FastAPI so'nggi yillarda Python veb-frameworklaridan eng mashhuriga aylandi, chunki u tip belgilari (13-qism) bilan ishlaydi, o'rganish oson va zamonaviy.

FastAPI'ning sehri — u sizning tip belgilaringizdan foydalanib, avtomatik validatsiya va interaktiv hujjat yaratadi. Kam kod, ko'p imkoniyat.

Real vaziyat. Bir jamoa eski framework bilan API yozardi — har endpoint uchun qo'lda validatsiya, qo'lda hujjat, ko'p shablon kod. Yangi endpoint qo'shish sekin edi, hujjat ko'pincha eskirardi. Ular FastAPI'ga o'tdi: endi endpoint — oddiy funksiya, tip belgilari validatsiya beradi, va hujjat avtomatik yaratiladi (/docs da interaktiv). Bir kunda qilganini bir soatda qildi, va hujjat hech qachon eskirmasdi — chunki u koddan yaratiladi. FastAPI mahsuldorlikni keskin oshirdi.

Bu darsda FastAPI bilan birinchi veb-ilovani yaratishni o'rganamiz.

Bu darsda:

  • FastAPI nima va nega mashhur
  • Birinchi ilova (FastAPI, @app.get)
  • Ilovani ishga tushirish (uvicorn)
  • Avtomatik hujjat (/docs, OpenAPI)
  • JSON javob (avtomatik)
  • Tip belgilari va FastAPI
  • CLI'siz test (TestClient)
  • Amaliy: birinchi API

ℹ FastAPI — tashqi vosita. Misollarda ilova TestClient bilan (server ishga tushirmasdan) sinaladi.


2. Nazariya — chuqur tushuntirish

2.1. FastAPI nima

FastAPI — zamonaviy Python veb-framework, tip belgilariga asoslangan:

Xususiyat Tafsilot
Tez Eng tez Python frameworklaridan (Starlette + Pydantic)
Tip belgilari Validatsiya va hujjat tiplardan
Avtomatik hujjat /docs — interaktiv (Swagger/OpenAPI)
Oson Kam kod, o'rganish oson
Zamonaviy async, Python 3.8+

FastAPI'ning falsafasi: tip belgilaringizni bir marta yozing, qolganini framework qiladi — validatsiya, seriyalizatsiya, hujjat.

2.2. Birinchi ilova

python
from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def ildiz():
    return {"xabar": "Salom, Wisar!"}
Element Ma'nosi
FastAPI() Ilova obyekti
@app.get("/") GET so'rov, / yo'lda
def ildiz() Endpoint funksiyasi
return {...} JSON javob (avtomatik)

@app.get("/") — dekorator: funksiyani / yo'ldagi GET endpoint qiladi. Lug'at qaytarsangiz, FastAPI uni JSON'ga aylantiradi.

2.3. Ishga tushirish (uvicorn)

FastAPI ilova ASGI server bilan ishlaydi 22.5-bob. Eng mashhuri — uvicorn:

bash
pip install fastapi uvicorn
uvicorn main:app --reload      # main.py dagi 'app' ni ishga tushiradi
http://127.0.0.1:8000/         # ilova
http://127.0.0.1:8000/docs     # interaktiv hujjat
Bayroq Ma'nosi
main:app main.py dagi app obyekti
--reload Kod o'zgarsa qayta yuklash (rivojlanish)

uvicorn — ASGI server: FastAPI ilovasini HTTP so'rovlarga ulaydi.

2.4. Avtomatik hujjat

FastAPI avtomatik interaktiv hujjat yaratadi:

Manzil Nima
/docs Swagger UI — interaktiv (sinash mumkin)
/redoc ReDoc — o'qish uchun
/openapi.json OpenAPI sxemasi (mashina o'qiydigan)

Hujjat koddan yaratiladi (endpointlar, tiplar, docstringlar) — hech qachon eskirmaydi. Bu FastAPI'ning eng sevimli xususiyatlaridan biri.

2.5. JSON javob

FastAPI qaytarilgan qiymatni avtomatik JSON'ga aylantiradi:

Qaytariladigan JSON
dict JSON obyekt
list JSON massiv
str, int JSON qiymat
Pydantic model (20.5) JSON obyekt
python
@app.get("/kurslar")
def kurslar():
    return {"kurslar": ["Python", "JS"]}   # avtomatik JSON

Content-Type: application/json va seriyalizatsiya 16.2-bob avtomatik — qo'lda json.dumps shart emas.

2.6. Tip belgilari va FastAPI

FastAPI tip belgilaridan (13-qism) foydalanadi:

python
@app.get("/kurslar/{kurs_id}")
def kurs(kurs_id: int):        # int — FastAPI tekshiradi va aylantiradi
    return {"id": kurs_id}

kurs_id: int — FastAPI URL parametrini int ga aylantiradi va noto'g'ri bo'lsa 422 xato beradi. Tip belgisi — validatsiya.

2.7. TestClient bilan test

FastAPI ilovani server ishga tushirmasdan test qilish (17-qism):

python
from fastapi.testclient import TestClient

client = TestClient(app)
javob = client.get("/")
assert javob.status_code == 200
assert javob.json() == {"xabar": "Salom, Wisar!"}

TestClient — ilovani dasturiy sinash: HTTP server kerak emas. Bu CLI (19.6) CliRunner ga o'xshaydi.

2.8. Nima uchun FastAPI mashhur

Sabab Tafsilot
Tezlik Eng tez Python frameworklaridan
Tip belgilari Validatsiya + hujjat bepul
Avtomatik hujjat Interaktiv, eskirmaydi
async qo'llab-quvvatlash Zamonaviy konkurentlik (14-qism)
Oson Kam shablon kod
Pydantic Kuchli validatsiya (20.5)

3. Tez ma'lumotnoma

python
from fastapi import FastAPI

app = FastAPI(title="Wisar API")

@app.get("/")
def ildiz():
    return {"xabar": "Salom"}

@app.get("/kurslar/{kurs_id}")
def kurs(kurs_id: int):
    return {"id": kurs_id}
bash
uvicorn main:app --reload      # ishga tushirish
# http://127.0.0.1:8000/docs   # hujjat
python
from fastapi.testclient import TestClient
client = TestClient(app)
client.get("/").json()

Qoidalar

FastAPI() — ilova; @app.get("/") — endpoint
lug'at qaytar → avtomatik JSON
tip belgilari → validatsiya (kurs_id: int)
uvicorn main:app --reload — ishga tushirish
/docs — avtomatik interaktiv hujjat
TestClient — server'siz test

4. Batafsil misollar

Misollarda FastAPI ilova TestClient bilan (server'siz) sinaladi. Warning'lar bostiriladi.

Misol 1 — Birinchi FastAPI ilova

python
"""FastAPI ilova; @app.get endpoint; lug'at → avtomatik JSON; TestClient bilan sinash; status kod va JSON javob."""

import warnings
warnings.filterwarnings("ignore")

from fastapi import FastAPI
from fastapi.testclient import TestClient

app = FastAPI(title="Wisar API", version="1.0.0")


@app.get("/")
def ildiz():
    return {"xabar": "Salom, Wisar!"}


@app.get("/kurslar")
def kurslar():
    return {"kurslar": ["Python", "JavaScript", "Go"]}


def main() -> None:
    client = TestClient(app)

    print("=== 1. Ildiz endpoint ===")
    javob = client.get("/")
    print(f"  status: {javob.status_code}")
    print(f"  JSON: {javob.json()}")

    print("\n=== 2. Kurslar endpoint ===")
    javob = client.get("/kurslar")
    print(f"  status: {javob.status_code}")
    print(f"  JSON: {javob.json()}")

    print("\n=== 3. Sarlavhalar (avtomatik) ===")
    javob = client.get("/")
    print(f"  Content-Type: {javob.headers['content-type']}")

    print("\n=== 4. Yo'q endpoint (404) ===")
    javob = client.get("/mavjud-emas")
    print(f"  status: {javob.status_code} ({'Not Found' if javob.status_code == 404 else '?'})")
    print("  ⭐ FastAPI: funksiya + dekorator = endpoint, lug'at → JSON avtomatik")


if __name__ == "__main__":
    main()

Natijaning muhim qismi:

text
=== 1. Ildiz endpoint ===
  status: 200
  JSON: {'xabar': 'Salom, Wisar!'}

=== 2. Kurslar endpoint ===
  status: 200
  JSON: {'kurslar': ['Python', 'JavaScript', 'Go']}

=== 3. Sarlavhalar (avtomatik) ===
  Content-Type: application/json

=== 4. Yo'q endpoint (404) ===
  status: 404 (Not Found)
  ⭐ FastAPI: funksiya + dekorator = endpoint, lug'at → JSON avtomatik

Nima ko'rsatdi: 2.2, 2.5-bo'limlar.

Misol 2 — Tip belgilari va yo'l parametrlari

python
"""yo'l parametrlari ({kurs_id}); tip belgisi (int) validatsiya beradi; noto'g'ri tur → 422; FastAPI avtomatik aylantiradi."""

import warnings
warnings.filterwarnings("ignore")

from fastapi import FastAPI
from fastapi.testclient import TestClient

app = FastAPI()

KURSLAR = {1: "Python", 2: "JavaScript", 3: "Go"}


@app.get("/kurslar/{kurs_id}")
def kurs(kurs_id: int):
    nom = KURSLAR.get(kurs_id, "topilmadi")
    return {"id": kurs_id, "nom": nom}


def main() -> None:
    client = TestClient(app)

    print("=== 1. Yo'l parametri (int) ===")
    javob = client.get("/kurslar/1")
    print(f"  /kurslar/1 → {javob.json()}")

    print("\n=== 2. Tur avtomatik aylantiriladi ===")
    javob = client.get("/kurslar/2")
    print(f"  /kurslar/2 → {javob.json()}")
    print(f"  id turi (JSON'da son): {type(javob.json()['id']).__name__}")

    print("\n=== 3. ⚠️ Noto'g'ri tur (422) ===")
    javob = client.get("/kurslar/abc")
    print(f"  /kurslar/abc → status {javob.status_code}")
    xato = javob.json()
    print(f"  xato turi: {xato['detail'][0]['type']}")
    print("  ⭐ 'abc' int emas → FastAPI 422 validatsiya xatosi beradi")

    print("\n=== 4. Mavjud emas ID ===")
    javob = client.get("/kurslar/999")
    print(f"  /kurslar/999 → {javob.json()}")
    print("  ⭐ tip belgisi (kurs_id: int) — validatsiya bepul")


if __name__ == "__main__":
    main()

Natijaning muhim qismi:

text
=== 1. Yo'l parametri (int) ===
  /kurslar/1 → {'id': 1, 'nom': 'Python'}

=== 2. Tur avtomatik aylantiriladi ===
  /kurslar/2 → {'id': 2, 'nom': 'JavaScript'}
  id turi (JSON'da son): int

=== 3. ⚠️ Noto'g'ri tur (422) ===
  /kurslar/abc → status 422
  xato turi: int_parsing
  ⭐ 'abc' int emas → FastAPI 422 validatsiya xatosi beradi

=== 4. Mavjud emas ID ===
  /kurslar/999 → {'id': 999, 'nom': 'topilmadi'}
  ⭐ tip belgisi (kurs_id: int) — validatsiya bepul

Nima ko'rsatdi: 2.6-bo'lim.

Misol 3 — Avtomatik OpenAPI hujjat

python
"""FastAPI avtomatik OpenAPI sxemasi yaratadi; /openapi.json; endpointlar, tiplar, metama'lumot koddan; /docs interaktiv."""

import warnings
warnings.filterwarnings("ignore")

from fastapi import FastAPI
from fastapi.testclient import TestClient

app = FastAPI(title="Wisar API", version="1.0.0", description="IlmHamroh ta'lim API")


@app.get("/kurslar")
def kurslar_royxati():
    """Barcha kurslarni qaytaradi."""
    return {"kurslar": []}


@app.get("/kurslar/{kurs_id}")
def bitta_kurs(kurs_id: int):
    """Bitta kursni ID bo'yicha qaytaradi."""
    return {"id": kurs_id}


@app.post("/kurslar")
def kurs_yarat():
    """Yangi kurs yaratadi."""
    return {"holat": "yaratildi"}


def main() -> None:
    client = TestClient(app)
    schema = client.get("/openapi.json").json()

    print("=== 1. API metama'lumoti ===")
    info = schema["info"]
    print(f"  title: {info['title']}")
    print(f"  version: {info['version']}")
    print(f"  description: {info['description']}")

    print("\n=== 2. Endpointlar (yo'llar) ===")
    for yol in sorted(schema["paths"].keys()):
        metodlar = sorted(schema["paths"][yol].keys())
        print(f"  {yol}: {[m.upper() for m in metodlar]}")

    print("\n=== 3. Endpoint tavsifi (docstring dan) ===")
    kurslar_get = schema["paths"]["/kurslar"]["get"]
    print(f"  GET /kurslar summary: {kurslar_get.get('summary', '')}")

    print("\n=== 4. Hujjat manzillari ===")
    print("  /docs      → Swagger UI (interaktiv)")
    print("  /redoc     → ReDoc (o'qish)")
    print("  /openapi.json → OpenAPI sxemasi")
    print("  ⭐ hujjat KODDAN yaratiladi — hech qachon eskirmaydi")


if __name__ == "__main__":
    main()

Natijaning muhim qismi:

text
=== 1. API metama'lumoti ===
  title: Wisar API
  version: 1.0.0
  description: IlmHamroh ta'lim API

=== 2. Endpointlar (yo'llar) ===
  /kurslar: ['GET', 'POST']
  /kurslar/{kurs_id}: ['GET']

=== 3. Endpoint tavsifi (docstring dan) ===
  GET /kurslar summary: Kurslar Royxati

=== 4. Hujjat manzillari ===
  /docs      → Swagger UI (interaktiv)
  /redoc     → ReDoc (o'qish)
  /openapi.json → OpenAPI sxemasi
  ⭐ hujjat KODDAN yaratiladi — hech qachon eskirmaydi

Nima ko'rsatdi: 2.4-bo'lim.

Misol 4 — Amaliy: birinchi kurslar API

To'liq, ishlaydigan kurslar API sini FastAPI bilan yaratamiz: kurslar ro'yxati, bitta kurs, filtr (so'rov parametri) va REST tamoyillariga amal qilgan endpointlar. Uni TestClient bilan sinaymiz. Bu — 20.1–20.2 nazariyasini FastAPI'da amalga oshirish.

python
"""to'liq kurslar API: ro'yxat, bitta kurs, filtr (so'rov parametri), 404; REST tamoyillari; TestClient bilan test."""

import warnings
warnings.filterwarnings("ignore")

from fastapi import FastAPI, HTTPException
from fastapi.testclient import TestClient

app = FastAPI(title="Wisar Kurslar API", version="1.0.0")

KURSLAR = [
    {"id": 1, "nom": "Python", "til": "uz", "daraja": "boshlangich"},
    {"id": 2, "nom": "JavaScript", "til": "uz", "daraja": "orta"},
    {"id": 3, "nom": "Go", "til": "en", "daraja": "orta"},
]


@app.get("/kurslar")
def kurslar_royxati(til: str | None = None):
    """Kurslar ro'yxati (til bo'yicha filtrlash mumkin)."""
    if til:
        return [k for k in KURSLAR if k["til"] == til]
    return KURSLAR


@app.get("/kurslar/{kurs_id}")
def bitta_kurs(kurs_id: int):
    """Bitta kurs ID bo'yicha."""
    for k in KURSLAR:
        if k["id"] == kurs_id:
            return k
    raise HTTPException(status_code=404, detail="kurs topilmadi")


def main() -> None:
    client = TestClient(app)

    print("=== 1. Barcha kurslar ===")
    javob = client.get("/kurslar")
    print(f"  status: {javob.status_code}, soni: {len(javob.json())}")

    print("\n=== 2. Filtr (so'rov parametri) ===")
    javob = client.get("/kurslar?til=uz")
    nomlar = [k["nom"] for k in javob.json()]
    print(f"  /kurslar?til=uz → {nomlar}")
    javob = client.get("/kurslar?til=en")
    print(f"  /kurslar?til=en → {[k['nom'] for k in javob.json()]}")

    print("\n=== 3. Bitta kurs ===")
    javob = client.get("/kurslar/1")
    print(f"  /kurslar/1 → {javob.json()}")

    print("\n=== 4. Yo'q kurs (404) ===")
    javob = client.get("/kurslar/999")
    print(f"  /kurslar/999 → status {javob.status_code}, {javob.json()}")

    print("\n=== 5. REST tamoyillari qo'llanildi ===")
    print("  ✅ GET /kurslar (ro'yxat), GET /kurslar/{id} (bitta)")
    print("  ✅ filtr — so'rov parametri (?til=uz)")
    print("  ✅ 404 topilmaganda; 200 muvaffaqiyatda")
    print("  ⭐ REST 20.2-bob + FastAPI = zamonaviy API")


if __name__ == "__main__":
    main()

Natijaning muhim qismi:

text
=== 1. Barcha kurslar ===
  status: 200, soni: 3

=== 2. Filtr (so'rov parametri) ===
  /kurslar?til=uz → ['Python', 'JavaScript']
  /kurslar?til=en → ['Go']

=== 3. Bitta kurs ===
  /kurslar/1 → {'id': 1, 'nom': 'Python', 'til': 'uz', 'daraja': 'boshlangich'}

=== 4. Yo'q kurs (404) ===
  /kurslar/999 → status 404, {'detail': 'kurs topilmadi'}

=== 5. REST tamoyillari qo'llanildi ===
  ✅ GET /kurslar (ro'yxat), GET /kurslar/{id} (bitta)
  ✅ filtr — so'rov parametri (?til=uz)
  ✅ 404 topilmaganda; 200 muvaffaqiyatda
  ⭐ REST 20.2-bob + FastAPI = zamonaviy API

Nima ko'rsatdi: 2.2, 2.5, 2.6-bo'limlar.


5. To'g'ri va noto'g'ri tushunishlar

Noto'g'ri fikr To'g'risi
"JSON'ni qo'lda json.dumps qilish" FastAPI avtomatik
"Hujjatni qo'lda yozish" /docs avtomatik (koddan)
"Validatsiyani qo'lda" Tip belgilari beradi
"FastAPI sekin" Eng tez Python frameworklaridan
"Server test uchun kerak" TestClient — server'siz
"Tip belgisi ixtiyoriy" Validatsiya va hujjat undan
"Hujjat eskiradi" Koddan — hech qachon
"FastAPI murakkab" Kam kod, oson

6. Keng tarqalgan xatolar va yechimlari

1. JSON'ni qo'lda seriyalash

python
return json.dumps({"x": 1})                 # ❌ FastAPI o'zi qiladi
return {"x": 1}                             # ✅

2. Tip belgisiz parametr

python
def kurs(kurs_id):                          # ⚠️ validatsiya yo'q
def kurs(kurs_id: int):                     # ✅ int validatsiya

3. Noto'g'ri metod

python
@app.get("/kurslar")   # yaratish uchun     # ❌ POST kerak
@app.post("/kurslar")                       # ✅

4. Xatoni oddiy qaytarish

python
return {"xato": "topilmadi"}                # ⚠️ status 200 qoladi
raise HTTPException(status_code=404, ...)   # ✅ 404

5. --reload ni ishlab chiqarishda

bash
uvicorn main:app --reload                   # ⚠️ faqat rivojlanish
uvicorn main:app --workers 4                # ✅ ishlab chiqarish

6. Hujjatni o'chirmaslik (ishlab chiqarish)

python
app = FastAPI()                             # /docs ochiq
app = FastAPI(docs_url=None)                # ✅ maxfiy API'da

7. Test'siz endpoint

python
# faqat qo'lda sinash                         # ❌
TestClient(app).get("/").json()             # ✅

7. Integratsiya — bu bilim qayerda kerak bo'ladi

  • 20.1–20.2-darslar (o'tilgan): HTTP, REST — FastAPI ularni amalga oshiradi
  • 13-qism (o'tilgan): tip belgilari — FastAPI validatsiyasi
  • 20.4-dars: route va parametrlar — chuqurroq
  • 20.5-dars: Pydantic — kuchli validatsiya
  • 20.15-dars: testlash — TestClient bilan

8. Eng yaxshi amaliyotlar

  1. Endpoint — oddiy funksiya + @app.get/post dekorator.

  2. Lug'at/model qaytaring — JSON avtomatik.

  3. Tip belgilarini ishlating (validatsiya bepul).

  4. Xatolarni HTTPException bilan (to'g'ri status kod).

  5. uvicorn --reload rivojlanishda, --workers ishlab chiqarishda.

  6. /docs avtomatik hujjatdan foydalaning.

  7. TestClient bilan test qiling (server'siz).

  8. REST tamoyillariga 20.2-bob amal qiling.


9. Amaliy topshiriq

Vazifa 1: Bashorat qiling

python
1.  # @app.get("/") nima yaratadi?
2.  # return {"x": 1} nima bo'ladi?
3.  # kurs_id: int noto'g'ri bo'lsa?
4.  # /docs nima?
5.  # uvicorn main:app nima ishga tushiradi?
6.  # TestClient nima uchun?
7.  # FastAPI JSON'ni kim qiladi?
8.  # hujjat qayerdan yaratiladi?
9.  # HTTPException nima beradi?
10. # --reload nima qiladi?
11. # /openapi.json nima?
12. # FastAPI qaysi tildan foydalanadi (validatsiya)?
Javoblar
  1. / yo'ldagi GET endpoint
  2. Avtomatik JSON javob
  3. 422 validatsiya xatosi
  4. Interaktiv Swagger hujjat
  5. main.py dagi app ni
  6. Server'siz test
  7. FastAPI avtomatik
  8. Koddan (endpointlar, tiplar)
  9. To'g'ri status kod (masalan 404)
  10. Kod o'zgarsa qayta yuklash
  11. OpenAPI sxemasi
  12. Tip belgilari

Vazifa 2: Xatolarni tuzating

python
1.  @app.get("/kurslar")
    def kurs_yarat():          # yaratish
        return {"holat": "yaratildi"}

2.  @app.get("/kurslar/{id}")
    def kurs(id):              # tip yo'q
        return {"id": id}

3.  def kurs(kurs_id):
        return json.dumps({"id": kurs_id})

4.  def kurs(kurs_id: int):
        if kurs_id not in KURSLAR:
            return {"xato": "topilmadi"}   # 200 qoladi

5.  # ishlab chiqarishda:
    uvicorn main:app --reload
Javoblar
python
1.  @app.post("/kurslar")      # yaratish → POST
    def kurs_yarat():
        return {"holat": "yaratildi"}

2.  @app.get("/kurslar/{id}")
    def kurs(id: int):         # tip belgisi

3.  def kurs(kurs_id: int):
        return {"id": kurs_id}  # avtomatik JSON

4.  def kurs(kurs_id: int):
        if kurs_id not in KURSLAR:
            raise HTTPException(status_code=404, detail="topilmadi")

5.  # ishlab chiqarishda:
    uvicorn main:app --workers 4

Vazifa 3: Birinchi API

"Vazifalar" API yarating:

  1. GET /vazifalar — ro'yxat
  2. GET /vazifalar/{id} — bitta (404 yo'q bo'lsa)
  3. Filtr (?bajarildi=true)
  4. TestClient bilan test

Vazifa 4: Hujjatni o'rganish

  1. Bir necha endpointli API yozing
  2. /openapi.json sxemasini tekshiring
  3. Docstring lar hujjatda ko'rinishini tasdiqlang
  4. /docs da qanday ko'rinishini tasvirlang

Vazifa 5: Validatsiya sinovi

  1. int, float, bool parametrli endpointlar
  2. Noto'g'ri turlar (422) ni sinang
  3. Xato xabar tuzilishini ko'ring
  4. Tip belgilari validatsiyasini hujjatlang

Vazifa 6: Test to'plami

  1. API uchun pytest testlari (17-qism)
  2. TestClient fixture (17.3)
  3. Har endpoint uchun test (200, 404, 422)
  4. Coverage 17.7-bob o'lchang

Vazifa 7: O'ylash

FastAPI 2018-yilda paydo bo'ldi va bir necha yilda Python veb-frameworklari orasida (Django, Flask bilan bir qatorda) mashhur bo'ldi — asosan tip belgilari va avtomatik hujjat tufayli. Nima uchun tip belgilaridan foydalanish (bir marta yozib, ko'p narsa olish) bunday kuchli g'oya, va bu "ma'lumotni bir joyda e'lon qilish" tamoyili dasturlashda qayerda uchraydi?

Javob

Qisqa javob: Tip belgilaridan foydalanish kuchli, chunki u bir manba, ko'p natija tamoyilini qo'llaydi: tip belgisi bir marta yoziladi, undan validatsiya, seriyalizatsiya, hujjat va IDE yordami avtomatik olinadi. Bu takrorni (DRY) yo'q qiladi va nomuvofiqlikni oldini oladi — tip, validatsiya va hujjat doim mos. "Ma'lumotni bir joyda e'lon qilish" tamoyili dasturlashda keng tarqalgan: sxema, model, tip — bir manba bo'lib, undan ko'p narsa hosil bo'ladi.

1. Nega tip belgilari kuchli

Bir marta Ko'p natija
kurs_id: int Validatsiya + hujjat + IDE + aylantirish
Pydantic model Sxema + validatsiya + JSON
Tip belgisi Bir manba, ko'p foyda

2. "Bir manba" (single source of truth)

Muammo (takror) Yechim (bir manba)
Tip, validatsiya, hujjat alohida Bittasidan hammasi
Nomuvofiqlik Doim mos
Yangilash bir necha joyda Bir joyda

3. Bu tamoyil boshqa joyda

Joy Bir manba
FastAPI Tip belgilari → hamma narsa
pyproject.toml (19.2) Metama'lumot bir joyda
Dinamik versiya (19.5) Versiya bir joyda
ORM model (23-qism) Model → jadval + validatsiya
Docstring (19.7) Hujjat koddan

4. Nega FastAPI muvaffaqiyatli

  1. Tip belgilari — Python'da allaqachon mavjud (13-qism)
  2. Ulardan avtomatik foyda (validatsiya, hujjat)
  3. Kam kod, kam xato
  4. Zamonaviy Python bilan mos

5. Muhandislik saboqlari

  1. Bir manba — takror va nomuvofiqlikni yo'q qiladi
  2. Deklaratsiyadan avtomatik hosil qilish — kuchli
  3. Mavjud xususiyatni (tip) qayta ishlatish
  4. DRY — dasturlashning asosiy tamoyili

6. Xulosa

  1. Tip belgilari bir marta yoziladi, ko'p narsa beradi
  2. "Bir manba" — takror va nomuvofiqlikni oldini oladi
  3. FastAPI tip belgilaridan avtomatik foyda oladi
  4. Bu tamoyil dasturlashda keng qo'llaniladi

Nimani mustahkamlaydi: 2.1–2.8-bo'limlar.


Xulosa

Bu darsda FastAPI bilan birinchi veb-ilovani yaratdik.

Eng muhim uch fikr:

  1. FastAPI — tip belgilariga asoslangan zamonaviy framework. Endpoint — oddiy funksiya + dekorator (@app.get("/")); lug'at qaytarsangiz, FastAPI uni avtomatik JSON'ga aylantiradi (Content-Type va seriyalizatsiya bepul). Tip belgilari (kurs_id: int) validatsiya beradi — noto'g'ri tur 422 xato beradi. FastAPI'ning falsafasi: tip belgilarini bir marta yozing, qolganini (validatsiya, seriyalizatsiya, hujjat) framework qiladi.

  2. Avtomatik hujjat — eng sevimli xususiyat. FastAPI koddan (endpointlar, tiplar, docstringlar) interaktiv hujjat yaratadi: /docs (Swagger UI — sinash mumkin), /redoc (o'qish), /openapi.json (mashina o'qiydigan sxema). Hujjat koddan yaratilgani uchun hech qachon eskirmaydi. Ilova uvicorn main:app --reload bilan ishga tushiriladi (ASGI server).

  3. TestClient bilan server'siz test. FastAPI ilovani HTTP server ishga tushirmasdan test qilish mumkin: TestClient(app).get("/") status kod va JSON javobni qaytaradi (CliRunner ga o'xshaydi). Bu 17-qism testlash bilan bog'lanadi. FastAPI aynan tip belgilaridan avtomatik foyda (validatsiya + hujjat) olgani va "bir manba, ko'p natija" tamoyilini qo'llagani uchun mashhur bo'ldi.

Keyingi darsda route va parametrlar ni chuqurroq o'rganamiz: yo'l parametrlari, so'rov parametrlari, ixtiyoriy va majburiy, standart qiymatlar va turli parametr turlari.

Ulashish:Telegram'da

Izohlar (0)

Izoh yozish uchun kiring.

  • Hozircha izoh yo'q. Birinchi bo'ling!
20.3-dars: FastAPI kirish — IlmHamroh