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, **NodeJS** və **Go** səviyyəsində (Starlette və Pydantic-ə təşəkkürlər). [Ən sürətli Python frameworklərindən biridir](#performans). * **Ç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 {% if sponsors %} {% for sponsor in sponsors.gold -%} {% endfor -%}` {%- for sponsor in sponsors.silver -%} {% endfor %} {% endif %} 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 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._"
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: * Web tərəfi üçün Starlette. * Data tərəfi üçün Pydantic. ## Quraşdırma
```console $ pip install fastapi ---> 100% ```
Tətbiqimizi əlçatan etmək üçün bizə Uvicorn və ya Hypercorn kimi ASGI server lazımdır.
```console $ pip install "uvicorn[standard]" ---> 100% ```
## Nümunə ### Kodu yaradaq * `main.py` adlı fayl yaradaq və ona aşağıdakı kodu yerləşdirək: ```Python 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: ```Python hl_lines="9 14" 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:
```console $ 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: ```JSON {"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}` _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](https://fastapi.tiangolo.com/img/index/index-01-swagger-ui-simple.png) ### 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](https://fastapi.tiangolo.com/img/index/index-02-redoc-simple.png) ## 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. ```Python hl_lines="4 9-12 25-27" 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](https://fastapi.tiangolo.com/img/index/index-03-swagger-02.png) * "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](https://fastapi.tiangolo.com/img/index/index-04-swagger-03.png) * 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](https://fastapi.tiangolo.com/img/index/index-05-swagger-04.png) ### 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](https://fastapi.tiangolo.com/img/index/index-06-redoc-02.png) ### 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: ```Python item_id: int ``` və ya daha mürəkkəb `Item` modeli üçün: ```Python 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: * `GET` və `PUT` sorğuları üçün `item_id`-nin yolda olub-olmadığını yoxlayacaq. * `item_id`-nin `GET` və `PUT` 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: ```Python return {"item_name": item.name, "item_id": item_id} ``` ...bundan: ```Python ... "item_name": item.name ... ``` ...buna: ```Python ... "item_price": item.price ... ``` ...və redaktorun məlumat tiplərini bildiyini və avtomatik tamaladığını görəcəksiniz: ![editor support](https://fastapi.tiangolo.com/img/vscode-completion.png) 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ə 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: * 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ə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.