Məzmuna keçin

FastAPI

FastAPI

FastAPI framework, yüksək məshuldarlı, öyrənməsi asan, çevik kodlama, istifadəyə hazırdır

Test Əhatə Paket versiyası Dəstəklənən Python versiyaları


Sənədlər: https://fastapi.tiangolo.com

Qaynaq Kodu: https://github.com/tiangolo/fastapi


FastAPI Python 3.8+ 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, NodeJSGo 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

`

Digə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."

Kabir Khan - Microsoft (ref)

"FastAPI kitabxanasını Proqnozlar əldə etmək üçün sorğulana bilən REST serverini yaratmaqda istifadə etdik."

Piero Molino, Yaroslav Dudin, and Sai Sumanth Miryala - Uber (ref)

"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]"

Kevin Glisson, Marc Vilanova, Forest Monsen - Netflix (ref)

"FastAPI üçün həyəcanlıyam. Çox əyləncəlidir!"

Brian Okken - Python Bytes podcast host (ref)

"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."

Timothy Crosley - Hug creator (ref)

"Ə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."

Ines Montani - Matthew Honnibal - Explosion AI founders - spaCy creators (ref) - (ref)

"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 asanyü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."

Deon Pillsbury - Cisco (ref)

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

Python 3.8+

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 asyncawait 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ında app = FastAPI() sətrində yaratdığımız FastAPI 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:

  • //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} yolu item_id adlı int qiyməti almalı olan yol parametrinə sahibdir.
  • /items/{item_id} yolunun q 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):

Swagger UI

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:

ReDoc

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}
Server avtomatik olaraq yenidən işə salınmalı idi (çünki biz yuxarıda 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:

Swagger UI

  • "Try it out" düyməsini klikləyin, bu, parametrləri doldurmağa və API ilə birbaşa əlaqə saxlamağa imkan verir:

Swagger UI interaction

  • 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:

Swagger UI interaction

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:

ReDoc

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 3.8+.

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...
  • 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:

  • GETPUT sorğuları üçün item_id-nin yolda olub-olmadığını yoxlayacaq.
  • item_id-nin GETPUT sorğuları üçün növünün int olduğunu yoxlayacaq.
    • Əgər int deyilsə, səbəbini göstərən bir xəta mesajı göstərəcəkdir.
  • məcburi olmayan q parametrinin GET (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, tipinin str olub olmadığını yoxlayacaq.
    • price adında məcburi bir parametr olub olmadığını və əgər varsa, tipinin float olub olmadığını yoxlayacaq.
    • is_offer adında məcburi olmayan bir parametr olub olmadığını və əgər varsa, tipinin float 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:

editor support

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ərifayllar olaraq müəyyən edilməsi.
  • maximum_length və ya regex 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:

Starlette tərəfindən istifadə olunanlar:

  • httpx - Əgər TestClient 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.