22 KiB
FastAPI
FastAPI frameworki, juda tez, o‘qish oson, tez kod yozish, production ga tayyor
Hujjatlar: https://fastapi.tiangolo.com
Manba kodi: https://github.com/fastapi/fastapi
FastAPI — bu zamonaviy, tez (yuqori samaradorlikka ega), Python uchun API yaratishda ishlatiladigan web-framework bo‘lib, standart Python tip ko‘rsatkichlariga asoslanadi (type hintlar).
Asosiy xususiyatlari:
- Tez: Juda yuqori samaradorlik, NodeJS va Go bilan teng (Starlette va Pydantic tufayli). Python uchun eng tez frameworklardan biri.
- Tez kod yozish: Funksiyalarni ishlab chiqish tezligini taxminan 200% dan 300% gacha oshiradi. *
- Kamroq xatolik: Inson (dasturchi) tomonidan yuzaga keladigan xatolarni taxminan 40% ga kamaytiradi. *
- Intuitiv: Ajoyib muharrir yordami. To‘ldirish har yerda. Kamroq vaqtni nosozliklarni tuzatishga sarflaysiz.
- Oson: Foydalanish va o‘rganish uchun qulay. Kamroq vaqt hujjatlarni o‘qishga ketadi.
- Qisqa: Kodni takrorlashni minimallashtiradi. Har bir parametr e’lonidan bir nechta imkoniyatlar. Kamroq xatolik.
- Barqaror: Ishlab chiqarishga tayyor kodga ega bo‘lasiz. Avtomatik interaktiv hujjatlar bilan.
- Standartlarga asoslangan: API uchun ochiq standartlarga asoslangan (va to‘liq mos): OpenAPI (ilgari Swagger nomi bilan tanilgan) va JSON Schema.
* ishlab chiqarish ilovalarini yaratishda ichki dasturchilar jamoasida o‘tkazilgan testlar asosida baholangan.
Homiylar
{% if sponsors %} {% for sponsor in sponsors.gold -%} {% endfor -%} {%- for sponsor in sponsors.silver -%} {% endfor %} {% endif %}
Fikrlar
"[...] Men hozirda FastAPI dan juda ko‘p foydalanmoqdaman. [...] Aslida, uni jamoamdagi barcha ML xizmatlari uchun ishlatishni rejalashtiryapman. Ularning ba’zilari asosiy Windows mahsulotiga va ba’zilari Office mahsulotlariga integratsiya qilinmoqda."
"Biz FastAPI kutubxonasini REST serverini ishga tushirish uchun qabul qildik, u orqali bashoratlar olish mumkin. [Ludwig uchun]"
"Netflix o‘zining inqiroz boshqaruvi orkestratsiya frameworki: Dispatch ni ochiq manba sifatida chiqarganini mamnuniyat bilan e’lon qiladi! [FastAPI yordamida yaratilgan]"
"Men FastAPI dan juda hayajondaman. Bu juda qiziqarli!"
"Rostini aytsam, siz yaratgan narsa juda mustahkam va sayqallangan ko‘rinadi. Ko‘p jihatdan, bu men Hug bo‘lishini istagan narsam edi — kimdir bunday narsani yaratganini ko‘rib, ilhomlanaman."
"Agar siz REST API lar qurish uchun zamonaviy framework o‘rganmoqchi bo‘lsangiz, FastAPI ga qarang [...] Bu tez, ishlatish va o‘rganish oson [...]"
"Biz API larimiz uchun FastAPI ga o‘tdik [...] Sizga yoqadi deb o‘ylayman [...]"
"Agar kimdir ishlab chiqarish uchun Python API yaratmoqchi bo‘lsa, men FastAPI ni tavsiya qilaman. Bu chiroyli ishlab chiqilgan, foydalanish uchun oddiy va juda kengaytiriladigan framework, u bizning API birinchi rivojlanish strategiyamizda asosiy komponentga aylandi va ko‘plab avtomatlashtirishlar va xizmatlarni, jumladan Virtual TAC Engineer’imizni boshqaradi."
Typer, CLI lar uchun FastAPI
Agar siz web API o‘rniga terminalda ishlatiladigan CLI dastur yaratmoqchi bo‘lsangiz, Typer ga e’tibor bering.
Typer — bu FastAPI ning kichik ukasi. U aynan CLI lar uchun FastAPI bo‘lishi uchun yaratilgan. ⌨️ 🚀
Talablar
FastAPI ulkanlar yelkasida turadi:
O‘rnatish
Virtual atrofni yarating va faollashtiring, so‘ng FastAPI ni o‘rnating:
$ pip install "fastapi[standard]"
---> 100%
Eslatma: "fastapi[standard]"
ni qo‘shtirnoq ichida yozing, shunda barcha terminallarda to‘g‘ri ishlaydi.
Misol
Yarating
main.py
fayl ni yarating pastdagi kod bilan:
from typing import Union
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"Hello": "World"}
@app.get("/items/{item_id}")
def read_item(item_id: int, q: Union[str, None] = None):
return {"item_id": item_id, "q": q}
Yoki async def
... ni ishlating.
Agar sizni kodiz async
/ await
asosiy so‘zlarni ishlatsa, async def
ni ishlating:
from typing import Union
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def read_root():
return {"Hello": "World"}
@app.get("/items/{item_id}")
async def read_item(item_id: int, q: Union[str, None] = None):
return {"item_id": item_id, "q": q}
E’tibor bering:
Agar bilmasangiz, hujjatlardagi async
va await
haqida "Shoshilinchmisiz?" bo‘limiga qarang.
Uni ishga tushirish
Serverni ishga tushirish uchun:
$ fastapi dev main.py
╭────────── FastAPI CLI - Development mode ───────────╮
│ │
│ Serving at: http://127.0.0.1:8000 │
│ │
│ API docs: http://127.0.0.1:8000/docs │
│ │
│ Running in development mode, for production use: │
│ │
│ fastapi run │
│ │
╰─────────────────────────────────────────────────────╯
INFO: Will watch for changes in these directories: ['/home/user/code/awesomeapp']
INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO: Started reloader process [2248755] using WatchFiles
INFO: Started server process [2248757]
INFO: Waiting for application startup.
INFO: Application startup complete.
fastapi dev main.py
... komanda haqida
fastapi dev
buyrug‘i sizning main.py
faylingizni o‘qiydi, undagi FastAPI ilovasini aniqlaydi va Uvicorn yordamida serverni ishga tushiradi.
Standart holatda, fastapi dev
lokal ishlab chiqish uchun avtomatik qayta yuklash (auto-reload) rejimida ishga tushadi.
Bu haqda batafsil ma’lumotni FastAPI CLI hujjatlarida o‘qishingiz mumkin.
Tekshirish
Browser da http://127.0.0.1:8000/items/5?q=somequery ni oching.
Shunga o'xshagan JSON javob ko'rasiz:
{"item_id": 5, "q": "somequery"}
Siz allaqachon quyidagi API ni yaratdingiz:
- HTTP so‘rovlarini quyidagi yo‘llar da qabul qiladi:
/
va/items/{item_id}
. - Har ikkala yo‘l ham
GET
operatsiyalarini (HTTP usullari deb ham ataladi) qabul qiladi. /items/{item_id}
yo‘li daitem_id
nomli yo‘l parametri bor va uint
bo‘lishi kerak./items/{item_id}
yo‘li da ixtiyoriystr
tipidagi so‘rov parametriq
mavjud.
Interaktiv API hujjatlar
Endi http://127.0.0.1:8000/docs manziliga o'ting.
Siz avtomatik interaktiv API hujjatlarini ( Swagger UI tomonidan taqdim etilgan) ko'rasiz:
Muqobil API hujjatlari
Endi http://127.0.0.1:8000/redoc manziliga o'ting.
Siz muqobil avtomatik hujjatlarni ( ReDoc tomonidan taqdim etilgan) ko'rasiz:
Misolni yangilash
Endi main.py
faylini PUT
so‘rovlaridan body (tanani) qabul qiladigan qilib o‘zgartiring.
Body ni Pydantic yordamida, standart Python tiplari orqali e’lon qiling.
from typing import Union
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class Item(BaseModel):
name: str
price: float
is_offer: Union[bool, None] = None
@app.get("/")
def read_root():
return {"Hello": "World"}
@app.get("/items/{item_id}")
def read_item(item_id: int, q: Union[str, None] = None):
return {"item_id": item_id, "q": q}
@app.put("/items/{item_id}")
def update_item(item_id: int, item: Item):
return {"item_name": item.name, "item_id": item_id}
fastapi dev
serveri avtomatik tarzda qayta yuklanadi.
Interaktiv API hujjatlarini yangilash
Endi http://127.0.0.1:8000/docs manziliga o'ting.
- Interaktiv API hujjatlari avtomatik tarzda yangilanadi, yangi body ham ko‘rsatiladi:
- "Try it out" tugmasini bosing, bu sizga parametrlarni to‘ldirish va API bilan bevosita ishlash imkonini beradi:
- Keyin "Execute" tugmasini bosing, foydalanuvchi interfeysi sizning API’ga so‘rov yuboradi, parametrlarni jo‘natadi, natijalarni oladi va ekranda ko‘rsatadi:
Muqobil API hujjatlarini yangilash
Endi http://127.0.0.1:8000/redoc manziliga o'ting.
- Muqobil hujjatlar ham yangi so‘rov parametri va body ni aks ettiradi:
Qisqacha takrorlash
Xulosa qilib aytganda, siz bir marta parametrlar, body va boshqalar uchun turlarni funksiya parametrlarida e’lon qilasiz.
Buni zamonaviy Python tiplari yordamida qilasiz.
Yangi sintaksis, maxsus kutubxona metodlari yoki klasslarini o‘rganishingiz shart emas.
Faqat oddiy Python.
Masalan, int
uchun:
item_id: int
yoki qiyinroq Item
model uchun:
item: Item
...va o‘sha bitta bayonot bilan siz quyidagilarni olasiz:
- Muharrir (editor) yordami, jumladan:
- Avto-to‘ldirish (completion).
- Tiplarni tekshirish (type checks).
- Ma’lumotlarni tekshirish (validation):
- Ma’lumotlar noto‘g‘ri bo‘lsa, avtomatik va aniq xatoliklar.
- Hattoki chuqur joylashgan (deeply nested) JSON obyektlari uchun ham tekshiruv.
- Kiruvchi ma’lumotlarni konvertatsiya qilish: tarmoqdan Python ma’lumotlari va turlariga o‘tkazish. Quyidagilardan o‘qish:
- JSON.
- Yo‘l (path) parametrlari.
- So‘rov (query) parametrlari.
- Cookies.
- Sarlavhalar (headers).
- Formalar.
- Fayllar.
- Chiquvchi ma’lumotlarni konvertatsiya qilish: Python ma’lumotlari va turlaridan tarmoq ma’lumotlariga (JSON ko‘rinishida) o‘tkazish:
- Python turlarini (
str
,int
,float
,bool
,list
va boshqalar) konvertatsiya qilish. datetime
obyektlari.UUID
obyektlari.- Ma’lumotlar bazasi modellari.
- ...va yana ko‘plab turlar.
- Python turlarini (
- Avtomatik interaktiv API hujjatlari, 2 ta muqobil foydalanuvchi interfeysi bilan:
- Swagger UI.
- ReDoc.
Oldingi kod namunasi bo‘yicha, FastAPI quyidagilarni amalga oshiradi:
GET
vaPUT
so‘rovlari uchun yo‘ldaitem_id
mavjudligini tekshiradi.GET
vaPUT
so‘rovlari uchunitem_id
ning turiint
ekanligini tekshiradi.- Agar u int bo‘lmasa, mijozga aniq va tushunarli xatolik ko‘rsatiladi.
GET
so‘rovlari uchunq
nomli ixtiyoriy so‘rov parametrining mavjudligini tekshiradi (masalan,http://127.0.0.1:8000/items/foo?q=somequery
).q
parametri= None
bilan e’lon qilinganligi sababli, u ixtiyoriy hisoblanadi.- Agar
None
bo‘lmasa, u majburiy bo‘lardi (xuddiPUT
da body majburiy bo‘lgani kabi).
/items/{item_id}
gaPUT
so‘rovlari uchun body ni JSON sifatida o‘qiydi:- Unda majburiy
name
atributi borligini va ustr
bo‘lishi kerakligini tekshiradi. - Majburiy
price
atributi borligini va ufloat
bo‘lishi kerakligini tekshiradi. - Ixtiyoriy
is_offer
atributi borligini va u (agar mavjud bo‘lsa)bool
bo‘lishi kerakligini tekshiradi. - Bularning barchasi chuqur joylashgan (deeply nested) JSON obyektlari uchun ham ishlaydi.
- Unda majburiy
- Avtomatik tarzda JSON ga va JSON dan konvertatsiya qiladi.
- Hammasini OpenAPI yordamida hujjatlashtiradi, bu quyidagilar uchun ishlatilishi mumkin:
- Interaktiv hujjatlash tizimlari.
- Ko‘plab dasturlash tillari uchun avtomatik mijoz kodi generatsiyasi tizimlari.
- To‘g‘ridan-to‘g‘ri 2 ta interaktiv hujjatlash web interfeysini taqdim etadi.
Biz faqat yuzaki ko‘rib chiqdik, lekin siz allaqachon hammasi qanday ishlashini tushundingiz.
Quyidagi qatorni o‘zgartirib ko‘ring:
return {"item_name": item.name, "item_id": item_id}
...bu joyni:
... "item_name": item.name ...
...quyidagiga o‘zgartiring:
... "item_price": item.price ...
...va muharriringiz atributlarni avtomatik to‘ldirishini va ularning turlarini bilishini ko‘ring:
Ko‘proq imkoniyatlarni o‘z ichiga olgan to‘liqroq misol uchun Tutorial - User Guide bo‘limiga qarang.
Ogohlantirish (spoiler): tutorial - foydalanuvchi qo‘llanmasida quyidagilar mavjud:
- Parametrlarni boshqa joylardan e’lon qilish: headerlar, cookielar, forma maydonlari va fayllar.
- Validatsiya cheklovlarini o‘rnatish, masalan:
maximum_length
yokiregex
. - Juda qulay va kuchli Dependency Injection tizimi.
- Xavfsizlik va autentifikatsiya, jumladan OAuth2 va JWT tokenlar, hamda HTTP Basic autentifikatsiyasi.
- Pydantic yordamida chuqur joylashgan JSON modellarini e’lon qilishning ilg‘or (lekin oson) usullari.
- GraphQL integratsiyasi: Strawberry va boshqa kutubxonalar yordamida.
- Ko‘plab qo‘shimcha imkoniyatlar (Starlette tufayli), jumladan:
- WebSocketlar
- HTTPX va
pytest
asosidagi juda oson testlar - CORS
- Cookie Sessionlar
- ...va boshqalar.
Performance
Mustaqil TechEmpower benchmark natijalari shuni ko‘rsatadiki, FastAPI ilovalari Uvicorn ostida eng tez ishlaydigan Python frameworklaridan biri hisoblanadi, faqat Starlette va Uvicorn (FastAPI ichida ishlatiladi) dan keyin turadi. (*)
Batafsil ma’lumot uchun Benchmarks bo‘limiga qarang.
Bog‘liqliklar
FastAPI Pydantic va Starlette kutubxonalariga bog‘liq.
standard
bog‘liqliklar
Agar siz FastAPI ni pip install "fastapi[standard]"
orqali o‘rnatsangiz, u standard
guruhidagi ixtiyoriy bog‘liqliklar bilan birga keladi:
Pydantic tomonidan ishlatiladi:
email-validator
— email manzillarini tekshirish uchun.
Starlette tomonidan ishlatiladi:
httpx
— agar sizTestClient
dan foydalanmoqchi bo‘lsangiz, talab qilinadi.jinja2
— standart shablon konfiguratsiyasidan foydalanish uchun kerak bo‘ladi.python-multipart
— forma "parsing" ni qo‘llab-quvvatlash uchun,request.form()
bilan ishlatiladi.
FastAPI / Starlette tomonidan ishlatiladi:
uvicorn
— ilovangizni yuklab, serverda ishga tushirish uchun. Buuvicorn[standard]
ni o‘z ichiga oladi, u yuqori samaradorlik uchun kerakli ba’zi bog‘liqliklarni (masalan,uvloop
) o‘z ichiga oladi.fastapi-cli
—fastapi
buyrug‘ini taqdim etadi.
standard
bog‘liqliklarsiz
Agar siz standard
ixtiyoriy bog‘liqliklarni o‘rnatishni xohlamasangiz, pip install fastapi
buyrug‘i orqali o‘rnating (pip install "fastapi[standard]"
o‘rniga).
Qo‘shimcha ixtiyoriy bog‘liqliklar
Qo‘shimcha o‘rnatishingiz mumkin bo‘lgan ba’zi bog‘liqliklar mavjud.
Qo‘shimcha ixtiyoriy Pydantic bog‘liqliklari:
pydantic-settings
— sozlamalarni boshqarish uchun.pydantic-extra-types
— Pydantic bilan ishlatish uchun qo‘shimcha turlar.
Qo‘shimcha ixtiyoriy FastAPI bog‘liqliklari:
orjson
— agar sizORJSONResponse
dan foydalanmoqchi bo‘lsangiz, talab qilinadi.ujson
— agar sizUJSONResponse
dan foydalanmoqchi bo‘lsangiz, talab qilinadi.
Litsenziya
Ushbu loyiha MIT litsenziyasi shartlariga muvofiq litsenziyalangan.