FastAPI
FastAPI framework, yüksək məshuldarlı, öyrənməsi asan, çevik kodlama, istifadəyə hazırdır
Sənədlər: https://fastapi.tiangolo.com
Qaynaq Kodu: https://github.com/tiangolo/fastapi
FastAPI Python ilə API yaratmaq üçün standart Python tip məsləhətlərinə əsaslanan, müasir, sürətli (yüksək performanslı) framework-dür.
Əsas xüsusiyyətləri bunlardır:
- Sürətli: Çox yüksək performans, NodeJS və Go səviyyəsində (Starlette və Pydantic-ə təşəkkürlər). Ən sürətli Python frameworklərindən biridir.
- Çevik kodlama: Funksiyanallıqları inkişaf etdirmək sürətini təxminən 200%-dən 300%-ə qədər artırın. *
- Daha az xəta: İnsan (developer) tərəfindən törədilən səhvlərin təxminən 40% -ni azaldın. *
- İntuitiv: Əla redaktor dəstəyi. Hər yerdə otomatik tamamlama. Xətaları müəyyənləşdirməyə daha az vaxt sərf edəcəksiniz.
- Asan: İstifadəsi və öyrənilməsi asan olması üçün nəzərdə tutulmuşdur. Sənədləri oxumaq üçün daha az vaxt ayıracaqsınız.
- Qısa: Kod təkrarlanmasını minimuma endirin. Hər bir parametr tərifində birdən çox xüsusiyyət ilə və daha az səhvlə qarşılaşacaqsınız.
- Güclü: Avtomatik və interaktiv sənədlərlə birlikdə istifadəyə hazır kod əldə edə bilərsiniz.
- Standartlara əsaslanan: API-lar üçün açıq standartlara əsaslanır (və tam uyğun gəlir): OpenAPI (əvvəlki adı ilə Swagger) və JSON Schema.
* Bu fikirlər daxili development komandasının hazırladıqları məhsulların sınaqlarına əsaslanır.
Sponsorlar¶
Rəylər¶
"[...] Son günlərdə FastAPI-ı çox istifadə edirəm. [...] Əslində onu komandamın bütün Microsoftda ML sevislərində istifadə etməyi planlayıram. Onların bəziləri windows-un əsas məhsuluna və bəzi Office məhsullarına inteqrasiya olunurlar."
"FastAPI kitabxanasını Proqnozlar əldə etmək üçün sorğulana bilən REST serverini yaratmaqda istifadə etdik."
"Netflix böhran idarəçiliyi orkestrləşmə framework-nün açıq qaynaqlı buraxılışını elan etməkdən məmnundur: Dispatch! [FastAPI ilə quruldu]"
"FastAPI üçün həyəcanlıyam. Çox əyləncəlidir!"
"Düzünü desəm, sizin qurduğunuz şey həqiqətən möhkəm və peşəkar görünür. Bir çox cəhətdən Hug-un olmasını istədiyim kimdir - kiminsə belə bir şey qurduğunu görmək həqiqətən ruhlandırıcıdır."
"Əgər REST API-lər yaratmaq üçün müasir framework öyrənmək istəyirsinizsə, FastAPI-a baxın [...] Sürətli, istifadəsi və öyrənməsi asandır. [...]"
"API xidmətlərimizi FastAPI-a köçürdük [...] Sizin də bəyənəcəyinizi düşünürük."
"Python ilə istifadəyə hazır API qurmaq istəyən hər kəsə FastAPI-ı tövsiyə edirəm. Möhtəşəm şəkildə dizayn edilmiş, istifadəsi asan və yüksək dərəcədə genişlənə bilən-dir, API əsaslı inkişaf strategiyamızın əsas komponentinə çevrilib və Virtual TAC Engineer kimi bir çox avtomatlaşdırma və servisləri idarə edir."
Typer, CLI-ların FastAPI-ı¶
Əgər siz veb API əvəzinə terminalda istifadə ediləcək CLI proqramı qurursunuzsa, Typer-a baxa bilərsiniz.
Typer FastAPI-ın kiçik qardaşıdır. Və o, CLI-lərin FastAPI-ı olmaq üçün nəzərdə tutulub. ⌨️ 🚀
Tələblər¶
FastAPI nəhənglərin çiyinlərində dayanır:
Quraşdırma¶
$ pip install fastapi
---> 100%
Tətbiqimizi əlçatan etmək üçün bizə Uvicorn və ya Hypercorn kimi ASGI server lazımdır.
$ pip install "uvicorn[standard]"
---> 100%
Nümunə¶
Kodu yaradaq¶
main.py
adlı fayl yaradaq və ona aşağıdakı kodu yerləşdirək:
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}
Və ya async def
...
Əgər kodunuzda async
və ya await
vardırsa async def
istifadə edə bilərik:
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}
Qeyd:
Əgər bu mövzu haqqında məlumatınız yoxdursa async
və await
sənədindəki "Tələsirsən?" bölməsinə baxa bilərsiniz.
Kodu işə salaq¶
Serveri aşağıdakı əmr ilə işə salaq:
$ uvicorn main:app --reload
INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO: Started reloader process [28720]
INFO: Started server process [28722]
INFO: Waiting for application startup.
INFO: Application startup complete.
uvicorn main:app --reload
əmri haqqında...
uvicorn main:app
əmri aşağıdakılara instinad edir:
main
:main.py
faylı (yəni Python "modulu").app
:main.py
faylındaapp = FastAPI()
sətrində yaratdığımızFastAPI
obyektidir.--reload
: kod dəyişikliyindən sonra avtomatik olaraq serveri yenidən işə salır. Bu parametrdən yalnız development mərhələsində istifadə etməliyik.
İndi yoxlayaq¶
Bu linki brauzerimizdə açaq http://127.0.0.1:8000/items/5?q=somequery.
Aşağıdakı kimi bir JSON cavabı görəcəksiniz:
{"item_id": 5, "q": "somequery"}
Siz artıq bir API yaratmısınız, hansı ki:
/
və/items/{item_id}
yollarında HTTP sorğularını qəbul edir.- Hər iki yolda
GET
əməliyyatlarını (həmçinin HTTP metodları kimi bilinir) aparır. /items/{item_id}
yoluitem_id
adlıint
qiyməti almalı olan yol parametrinə sahibdir./items/{item_id}
yolununq
adlı yol parametri var və bu parametr istəyə bağlı olsa da,str
qiymətini almalıdır.
İnteraktiv API Sənədləri¶
İndi http://127.0.0.1:8000/docs ünvanına daxil olun.
Avtomatik interaktiv API sənədlərini görəcəksiniz (Swagger UI tərəfindən təmin edilir):
Alternativ API sənədləri¶
İndi isə http://127.0.0.1:8000/redoc ünvanına daxil olun.
ReDoc tərəfindən təqdim edilən avtomatik sənədləri görəcəksiniz:
Nümunəni Yeniləyək¶
İndi gəlin main.py
faylını PUT
sorğusu ilə birlikdə gövdə qəbul edəcək şəkildə dəyişdirək.
Pydantic sayəsində standart Python tiplərindən istifadə edərək gövdəni müəyyən edək.
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}
uvicorn
əmri ilə --reload
parametrindən istifadə etmişik).
İnteraktiv API sənədlərindəki dəyişikliyə baxaq¶
Yenidən http://127.0.0.1:8000/docs ünvanına daxil olun.
- İnteraktiv API sənədləri yeni gövdə də daxil olmaq ilə avtomatik olaraq yenilənəcək:
- "Try it out" düyməsini klikləyin, bu, parametrləri doldurmağa və API ilə birbaşa əlaqə saxlamağa imkan verir:
- Sonra "Execute" düyməsini klikləyin, istifadəçi interfeysi API ilə əlaqə quracaq, parametrləri göndərəcək, nəticələri əldə edəcək və onları ekranda göstərəcək:
Alternativ API Sənədlərindəki Dəyişikliyə Baxaq¶
İndi isə yenidən http://127.0.0.1:8000/redoc ünvanına daxil olun.
- Alternativ sənədlər həm də yeni sorğu parametri və gövdəsini əks etdirəcək:
Xülasə¶
Ümumiləşdirsək, parametrlər, gövdə və s. Biz məlumat növlərini bir dəfə funksiya parametrləri kimi təyin edirik.
Bunu standart müasir Python tipləri ilə edirsiniz.
Yeni sintaksis, müəyyən bir kitabxananın metodlarını və ya siniflərini və s. öyrənmək məcburiyyətində deyilsiniz.
Sadəcə standart Python.
Məsələn, int
üçün:
item_id: int
və ya daha mürəkkəb Item
modeli üçün:
item: Item
...və yalnız parametr tipini təyin etməklə bunları əldə edirsiniz:
- Redaktor dəstəyi ilə:
- Avtomatik tamamlama.
- Tip yoxlanması.
- Məlumatların Təsdiqlənməsi:
- Məlumat etibarsız olduqda avtomatik olaraq aydın xətalar göstərir.
- Hətta çox dərin JSON obyektlərində belə doğrulama aparır.
- Daxil olan məlumatları çevirmək üçün aşağıdakı məlumat növlərindən istifadə edilir:
- JSON.
- Yol parametrləri.
- Sorğu parametrləri.
- Çərəzlər.
- Başlıqlaq.
- Formalar.
- Fayllar.
- Daxil olan məlumatları çevirmək üçün aşağıdakı məlumat növlərindən istifadə edilir (JSON olaraq):
- Python tiplərinin (
str
,int
,float
,bool
,list
, və s) çevrilməsi. datetime
obyektləri.UUID
obyektləri.- Verilənlər bazası modelləri.
- və daha çoxu...
- Python tiplərinin (
- 2 alternativ istifadəçi interfeysi daxil olmaqla avtomatik interaktiv API sənədlərini təmin edir:
- Swagger UI.
- ReDoc.
Gəlin əvvəlki nümunəyə qayıdaq və FastAPI-nin nələr edəcəyinə nəzər salaq:
GET
vəPUT
sorğuları üçünitem_id
-nin yolda olub-olmadığını yoxlayacaq.item_id
-ninGET
vəPUT
sorğuları üçün növününint
olduğunu yoxlayacaq.- Əgər
int
deyilsə, səbəbini göstərən bir xəta mesajı göstərəcəkdir.
- Əgər
- məcburi olmayan
q
parametrininGET
(http://127.0.0.1:8000/items/foo?q=somequery
burdakı kimi) sorğusu içərisində olub olmadığını yoxlayacaq.q
parametrini= None
ilə yaratdığımız üçün, məcburi olmayan parametr olacaq.- Əgər
None
olmasaydı, bu məcburi parametr olardı (PUT
metodunun gövdəsində olduğu kimi).
PUT
sorğusu üçün,/items/{item_id}
gövdəsini JSON olaraq oxuyacaq:name
adında məcburi bir parametr olub olmadığını və əgər varsa, tipininstr
olub olmadığını yoxlayacaq.price
adında məcburi bir parametr olub olmadığını və əgər varsa, tipininfloat
olub olmadığını yoxlayacaq.is_offer
adında məcburi olmayan bir parametr olub olmadığını və əgər varsa, tipininfloat
olub olmadığını yoxlayacaq.- Bütün bunlar ən dərin JSON obyektlərində belə işləyəcək.
- Məlumatların JSON-a və JSON-un Python obyektinə çevrilməsi avtomatik həyata keçiriləcək.
- Hər şeyi OpenAPI ilə uyğun olacaq şəkildə avtomatik olaraq sənədləşdirəcək və onları aşağıdakı kimi istifadə edə biləcək:
- İnteraktiv sənədləşmə sistemləri.
- Bir çox proqramlaşdırma dilləri üçün avtomatlaşdırılmış müştəri kodu yaratma sistemləri.
- 2 interaktiv sənədləşmə veb interfeysini birbaşa təmin edəcək.
Yeni başlamışıq, amma siz artıq işin məntiqini başa düşmüsünüz.
İndi aşağıdakı sətri dəyişdirməyə çalışın:
return {"item_name": item.name, "item_id": item_id}
...bundan:
... "item_name": item.name ...
...buna:
... "item_price": item.price ...
...və redaktorun məlumat tiplərini bildiyini və avtomatik tamaladığını görəcəksiniz:
Daha çox funksiyaya malik daha dolğun nümunə üçün Öyrədici - İstifadəçi Təlimatı səhifəsinə baxa bilərsiniz.
Spoiler xəbərdarlığı: Öyrədici - istifadəçi təlimatına bunlar daxildir:
- Parametrlərin, başlıqlar, çərəzlər, forma sahələri və fayllar olaraq müəyyən edilməsi.
maximum_length
və yaregex
kimi doğrulama məhdudiyyətlərinin necə təyin ediləcəyi.- Çox güclü və istifadəsi asan Dependency Injection sistemi.
- Təhlükəsizlik və autentifikasiya, JWT tokenləri ilə OAuth2 dəstəyi və HTTP Basic autentifikasiyası.
- çox dərin JSON modellərini müəyyən etmək üçün daha irəli səviyyə (lakin eyni dərəcədə asan) üsullar (Pydantic sayəsində).
- Strawberry və digər kitabxanalar ilə GraphQL inteqrasiyası.
- Digər əlavə xüsusiyyətlər (Starlette sayəsində):
- WebSockets
- HTTPX və
pytest
sayəsində çox asan testlər - CORS
- Cookie Sessions
- ...və daha çoxu.
Performans¶
Müstəqil TechEmpower meyarları göstərir ki, Uvicorn üzərində işləyən FastAPI proqramları ən sürətli Python kitabxanalarından biridir, yalnız Starlette və Uvicorn-un özündən yavaşdır, ki FastAPI bunların üzərinə qurulmuş bir framework-dür. (*)
Ətraflı məlumat üçün bu bölməyə nəzər salın Müqayisələr.
Məcburi Olmayan Tələblər¶
Pydantic tərəfindən istifadə olunanlar:
email_validator
- e-poçtun yoxlanılması üçün.pydantic-settings
- parametrlərin idarə edilməsi üçün.pydantic-extra-types
- Pydantic ilə istifadə edilə bilən əlavə tiplər üçün.
Starlette tərəfindən istifadə olunanlar:
httpx
- ƏgərTestClient
strukturundan istifadə edəcəksinizsə, tələb olunur.jinja2
- Standart şablon konfiqurasiyasından istifadə etmək istəyirsinizsə, tələb olunur.python-multipart
-request.form()
ilə forma "çevirmə" dəstəyindən istifadə etmək istəyirsinizsə, tələb olunur.itsdangerous
-SessionMiddleware
dəstəyi üçün tələb olunur.pyyaml
-SchemaGenerator
dəstəyi üçün tələb olunur (Çox güman ki, FastAPI istifadə edərkən buna ehtiyacınız olmayacaq).ujson
-UJSONResponse
istifadə etmək istəyirsinizsə, tələb olunur.
Həm FastAPI, həm də Starlette tərəfindən istifadə olunur:
uvicorn
- Yaratdığımız proqramı servis edəcək veb server kimi fəaliyyət göstərir.orjson
-ORJSONResponse
istifadə edəcəksinizsə tələb olunur.
Bütün bunları pip install fastapi[all]
ilə quraşdıra bilərsiniz.
Lisenziya¶
Bu layihə MIT lisenziyasının şərtlərinə əsasən lisenziyalaşdırılıb.