Mundarija (22)
- 1. Kirish va motivatsiya
- 2. Nazariya — chuqur tushuntirish
- 2.1. FastAPI nima
- 2.2. Birinchi ilova
- 2.3. Ishga tushirish (uvicorn)
- 2.4. Avtomatik hujjat
- 2.5. JSON javob
- 2.6. Tip belgilari va FastAPI
- 2.7. TestClient bilan test
- 2.8. Nima uchun FastAPI mashhur
- 3. Tez ma'lumotnoma
- 4. Batafsil misollar
- Misol 1 — Birinchi FastAPI ilova
- Misol 2 — Tip belgilari va yo'l parametrlari
- Misol 3 — Avtomatik OpenAPI hujjat
- Misol 4 — Amaliy: birinchi kurslar API
- 5. To'g'ri va noto'g'ri tushunishlar
- 6. Keng tarqalgan xatolar va yechimlari
- 7. Integratsiya — bu bilim qayerda kerak bo'ladi
- 8. Eng yaxshi amaliyotlar
- 9. Amaliy topshiriq
- Xulosa
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 ilovaTestClientbilan (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
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:
pip install fastapi uvicorn
uvicorn main:app --reload # main.py dagi 'app' ni ishga tushiradihttp://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 |
@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:
@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):
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
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}uvicorn main:app --reload # ishga tushirish
# http://127.0.0.1:8000/docs # hujjatfrom 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 test4. Batafsil misollar
Misollarda FastAPI ilova
TestClientbilan (server'siz) sinaladi. Warning'lar bostiriladi.
Misol 1 — Birinchi FastAPI ilova
"""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:
=== 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 avtomatikNima ko'rsatdi: 2.2, 2.5-bo'limlar.
Misol 2 — Tip belgilari va yo'l parametrlari
"""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:
=== 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 bepulNima ko'rsatdi: 2.6-bo'lim.
Misol 3 — Avtomatik OpenAPI hujjat
"""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:
=== 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 eskirmaydiNima 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.
"""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:
=== 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 APINima 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
return json.dumps({"x": 1}) # ❌ FastAPI o'zi qiladi
return {"x": 1} # ✅2. Tip belgisiz parametr
def kurs(kurs_id): # ⚠️ validatsiya yo'q
def kurs(kurs_id: int): # ✅ int validatsiya3. Noto'g'ri metod
@app.get("/kurslar") # yaratish uchun # ❌ POST kerak
@app.post("/kurslar") # ✅4. Xatoni oddiy qaytarish
return {"xato": "topilmadi"} # ⚠️ status 200 qoladi
raise HTTPException(status_code=404, ...) # ✅ 4045. --reload ni ishlab chiqarishda
uvicorn main:app --reload # ⚠️ faqat rivojlanish
uvicorn main:app --workers 4 # ✅ ishlab chiqarish6. Hujjatni o'chirmaslik (ishlab chiqarish)
app = FastAPI() # /docs ochiq
app = FastAPI(docs_url=None) # ✅ maxfiy API'da7. Test'siz endpoint
# 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
Endpoint — oddiy funksiya +
@app.get/postdekorator.Lug'at/model qaytaring — JSON avtomatik.
Tip belgilarini ishlating (validatsiya bepul).
Xatolarni
HTTPExceptionbilan (to'g'ri status kod).uvicorn --reloadrivojlanishda,--workersishlab chiqarishda./docsavtomatik hujjatdan foydalaning.TestClientbilan test qiling (server'siz).REST tamoyillariga 20.2-bob amal qiling.
9. Amaliy topshiriq
Vazifa 1: Bashorat qiling
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
/yo'ldagi GET endpoint- Avtomatik JSON javob
- 422 validatsiya xatosi
- Interaktiv Swagger hujjat
- main.py dagi
appni - Server'siz test
- FastAPI avtomatik
- Koddan (endpointlar, tiplar)
- To'g'ri status kod (masalan 404)
- Kod o'zgarsa qayta yuklash
- OpenAPI sxemasi
- Tip belgilari
Vazifa 2: Xatolarni tuzating
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 --reloadJavoblar
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 4Vazifa 3: Birinchi API
"Vazifalar" API yarating:
GET /vazifalar— ro'yxatGET /vazifalar/{id}— bitta (404 yo'q bo'lsa)- Filtr (
?bajarildi=true) TestClientbilan test
Vazifa 4: Hujjatni o'rganish
- Bir necha endpointli API yozing
/openapi.jsonsxemasini tekshiring- Docstring lar hujjatda ko'rinishini tasdiqlang
/docsda qanday ko'rinishini tasvirlang
Vazifa 5: Validatsiya sinovi
int,float,boolparametrli endpointlar- Noto'g'ri turlar (422) ni sinang
- Xato xabar tuzilishini ko'ring
- Tip belgilari validatsiyasini hujjatlang
Vazifa 6: Test to'plami
- API uchun
pytesttestlari (17-qism) TestClientfixture (17.3)- Har endpoint uchun test (200, 404, 422)
- 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
- Tip belgilari — Python'da allaqachon mavjud (13-qism)
- Ulardan avtomatik foyda (validatsiya, hujjat)
- Kam kod, kam xato
- Zamonaviy Python bilan mos
5. Muhandislik saboqlari
- Bir manba — takror va nomuvofiqlikni yo'q qiladi
- Deklaratsiyadan avtomatik hosil qilish — kuchli
- Mavjud xususiyatni (tip) qayta ishlatish
- DRY — dasturlashning asosiy tamoyili
6. Xulosa
- Tip belgilari bir marta yoziladi, ko'p narsa beradi
- "Bir manba" — takror va nomuvofiqlikni oldini oladi
- FastAPI tip belgilaridan avtomatik foyda oladi
- 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:
FastAPI — tip belgilariga asoslangan zamonaviy framework. Endpoint — oddiy funksiya + dekorator (
@app.get("/")); lug'at qaytarsangiz, FastAPI uni avtomatik JSON'ga aylantiradi (Content-Typeva seriyalizatsiya bepul). Tip belgilari (kurs_id: int) validatsiya beradi — noto'g'ri tur422xato beradi. FastAPI'ning falsafasi: tip belgilarini bir marta yozing, qolganini (validatsiya, seriyalizatsiya, hujjat) framework qiladi.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. Ilovauvicorn main:app --reloadbilan ishga tushiriladi (ASGI server).TestClientbilan server'siz test. FastAPI ilovani HTTP server ishga tushirmasdan test qilish mumkin:TestClient(app).get("/")status kod va JSON javobni qaytaradi (CliRunnerga 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.
Izohlar (0)
Izoh yozish uchun kiring.
- Hozircha izoh yo'q. Birinchi bo'ling!