FastAPI çerçevesi, yüksek performans, öğrenmesi kolay, kodlaması hızlı, üretime hazır
Belgeler: https://fastapi.tiangolo.com
Kaynak kodu: https://github.com/tiangolo/fastapi
FastAPI, standart Python türü ipuçlarına dayalı Python 3.6+ ile API'ler oluşturmaya yönelik modern, hızlı (yüksek performanslı) bir web çerçevesidir.
Temel özellikler şunlardır:
- Hızlı: NodeJS ve Go ile eşit düzeyde çok yüksek performans. Mevcut en hızlı Python framework'lerinden biri.
- Hızlı kodlama: Özellikleri geliştirme hızını yaklaşık %200 ila %300 artırın. *
- Daha az hata: İnsan (geliştirici) kaynaklı hataların yaklaşık %40'ını azaltın. *
- Sezgisel:Harika editör desteği. tamamlama her yerde. Daha az zaman hata ayıklama.
- Kolay:Kullanımı ve öğrenmesi kolay olacak şekilde tasarlanmıştır. Dokümanları okumak için daha az zaman.
- Kısa: Kod tekrarını en aza indirin. Her parametre bildiriminden birden çok özellik. Daha az hata.
- Sağlam: Üretime hazır kod alın. Otomatik etkileşimli belgelerle.
- Standartlara dayalı: API'ler için açık standartları temel alır (ve bunlarla tamamen uyumludur):OpenAPI (önceden Swagger olarak biliniyordu) ve JSON Şeması.
* üretim uygulamaları oluşturan dahili bir geliştirme ekibindeki testlere dayalı tahmin.
"[...] Bu günlerde bir ton FastAPI kullanıyorum. [...] Aslında bunu ekibimin Microsoft**'taki tüm **ML hizmetleri için kullanmayı planlıyorum. temel Windows ürününe ve bazı Office ürünlerine entegre oluyorlar."
"FastAPI kitaplığını, tahminler elde etmek için sorgulanabilecek bir REST sunucusu oluşturmak için benimsedik. [Ludwig için]"
"Netflix, kriz yönetimi düzenleme çerçevemizin açık kaynaklı sürümünü duyurmaktan mutluluk duyar: Dispatch! [FastAPI ile oluşturulmuştur]"
"FastAPI için çok heyecanlıyım. Çok eğlenceli!"
"Dürüst olmak gerekirse, yaptığın şey süper sağlam ve gösterişli görünüyor. Birçok yönden, Sarılmak olmasını istediğim şey buydu - birinin bunu yaptığını görmek gerçekten ilham verici."
"REST API'leri oluşturmak için bir modern çerçeve öğrenmek istiyorsanız, FastAPI'ye göz atın [...] Hızlı, kullanımı kolay ve öğrenmesi kolay [...]_"
"API'lerimiz için FastAPI'ye geçtik [...] Beğeneceğinizi düşünüyorum [...]"
Eğer bir bina yapıyorsanız CLI bir web API'si yerine terminalde kullanılacak uygulama, kontrol edin Typer.
Typer FastAPI'nin küçük kardeşidir. Ve CLI'lerin FastAPI'si olması amaçlanmıştır. ⌨️ 🚀
Python 3.6+
FastAPI devlerin omuzlarında duruyor:
$ pip install fastapi
---> 100%
Ayrıca üretim için bir ASGI sunucusuna ihtiyacınız olacak. Uvicorn veya Hypercorn.
$ pip install "uvicorn[standard]"
---> 100%
- Şunlarla bir "main.py" dosyası oluşturun:
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}
Or use async def
...
If your code uses async
/ await
, use async def
:
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}
Not:
Bilmiyorsanız, hakkında "Aceleniz mi var?" bölümüne bakın. dokümanlarda "async" ve "await".
Sunucuyu şununla çalıştırın:
$ 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.
Komut hakkında uvicorn main:uygulama -- yeniden yükle
...
"uvicorn main:app" komutu şu anlama gelir:
main
: the filemain.py
(the Python "module").app
: the object created inside ofmain.py
with the lineapp = FastAPI()
.--reload
: make the server restart after code changes. Only do this for development.
Tarayıcınızı şuradan açın: http://127.0.0.1:8000/items/5?q=somequery.
JSON yanıtını şu şekilde göreceksiniz:
{"item_id": 5, "q": "somequery"}
Zaten bir API oluşturdunuz:
- paths
/
ve/items/{item_id}
içindeki HTTP isteklerini alır. - Both paths take
GET
operasyonlar (HTTP methods olarak da bilinir). - path "/items/{item_id}", "int" olması gereken bir path parametresi "item_id"ye sahiptir.
- path
/items/{item_id}
, isteğe bağlı birstr
query parametresiq
içerir.
şimdi git http://127.0.0.1:8000/docs.
Otomatik etkileşimli API belgelerini göreceksiniz (tarafından sunulan Swagger Kullanıcı Arayüzü):
Ve şimdi git http://127.0.0.1:8000/redoc.
Alternatif otomatik belgeleri göreceksiniz(tarafından sunulanyeniden belge):
Şimdi bir 'PUT' isteğinden bir gövde almak için 'main.py' dosyasını değiştirin.
Pydantic sayesinde standart Python türlerini kullanarak gövdeyi bildirin.
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}
Sunucu otomatik olarak yeniden yüklenmelidir (çünkü yukarıdaki "uvicorn" komutuna "--reload" eklediniz).
şimdi git http://127.0.0.1:8000/docs.
- Etkileşimli API belgeleri, yeni gövde de dahil olmak üzere otomatik olarak güncellenecektir:
- "Dene" düğmesine tıklayın, parametreleri doldurmanıza ve doğrudan API ile etkileşime girmenize olanak tanır:
- Ardından "Yürüt" düğmesine tıklayın, kullanıcı arayüzü API'niz ile iletişim kuracak, parametreleri gönderecek, sonuçları alacak ve bunları ekranda gösterecektir:
And now, go to http://127.0.0.1:8000/redoc.
- Alternatif belgeler, yeni sorgu parametresini ve gövdesini de yansıtacaktır:
Özetle, parametre, gövde vb. türlerini bir kez işlev parametreleri olarak bildirirsiniz.
Bunu standart modern Python türleriyle yaparsınız.
Yeni bir sözdizimi, belirli bir kitaplığın yöntemlerini veya sınıflarını vb. öğrenmeniz gerekmez.
Sadece standart Python 3.6+.
Örneğin, bir "int" için:
item_id: int
veya daha karmaşık bir "Öğe" modeli için:
item: Item
... ve bu tek beyanla şunları elde edersiniz:
- Aşağıdakiler dahil editör desteği:
- Tamamlama.
- Tip kontrolleri.
- Verilerin doğrulanması:
- Veriler geçersiz olduğunda otomatik ve net hatalar.
- Derinlemesine yuvalanmış JSON nesneleri için bile doğrulama.
- Dönüştürmekgirdi verilerinin sayısı: ağdan Python verisine ve türlerine geliyor. Şuradan okuma:
*JSON.
- Yol parametreleri.
- Sorgu parametreleri.
- Cookies.
- Başlıklar.
- Formlar.
- Dosyalar.
- Dönüştürmek çıktı verilerinin sayısı: Python verilerinden ve türlerinden ağ verilerine dönüştürme (JSON olarak):
- Python türlerini dönüştürme(
str
,int
,float
,bool
,list
, etc). - 'datetime' nesneleri.
- "UUID" nesneleri.
- Veritabanı modelleri.
- ...ve daha fazlası.
- Python türlerini dönüştürme(
- Automatic interactive API documentation, including 2 alternative user interfaces:
- Swagger kullanıcı arayüzü.
- ReDoc.
Önceki kod örneğine dönersek, FastAPI şunları yapacaktır:
- "GET" ve "PUT" isteklerinin yolunda bir "item_id" olduğunu doğrulayın.
- "item_id"nin "GET" ve "PUT" istekleri için "int" türünde olduğunu doğrulayın.
- Değilse, istemci yararlı, net bir hata görecektir.
- "GET" istekleri için "q" adlı isteğe bağlı bir sorgu parametresi olup olmadığını kontrol edin ('http://127.0.0.1:8000/items/foo?q=somequery'de olduğu gibi).
- 'q' parametresi '= None' ile bildirildiğinden isteğe bağlıdır.
- "Hiçbiri" olmadan gerekli olacaktır ("PUT" durumunda gövde olduğu gibi).
- '/items/{item_id}' için 'PUT' istekleri için, Gövdeyi JSON olarak okuyun:
- Bir "str" olması gereken gerekli bir "ad" özniteliğine sahip olup olmadığını kontrol edin.
- Bir "değişken" olması gereken zorunlu bir "fiyat" özniteliğine sahip olup olmadığını kontrol edin.
- Varsa, bir "bool" olması gereken isteğe bağlı bir "is_offer" özniteliğine sahip olup olmadığını kontrol edin.
- Tüm bunlar, derinlemesine iç içe geçmiş JSON nesneleri için de işe yarar. *JSON'dan ve JSON'a otomatik olarak dönüştürün.
- Aşağıdakiler tarafından kullanılabilecek her şeyi OpenAPI ile belgeleyin:
- Ietkileşimli dokümantasyon sistemleri.
- Birçok dil için otomatik istemci kodu oluşturma sistemleri.
- Doğrudan 2 etkileşimli dokümantasyon web arayüzü sağlayın.
Biz sadece yüzeyi çizdik, ama zaten her şeyin nasıl çalıştığına dair bir fikriniz var.
Satırı şununla değiştirmeyi deneyin:
return {"item_name": item.name, "item_id": item_id}
...from:
... "item_name": item.name ...
...to:
... "item_price": item.price ...
...ve düzenleyicinizin özellikleri nasıl otomatik olarak tamamlayacağını ve türlerini nasıl bileceğini görün:
Daha fazla özellik içeren daha eksiksiz bir örnek için Öğretici - Kullanıcı Kılavuzu'na bakın.
Spoiler uyarısı: öğretici - kullanım kılavuzu şunları içerir:
*Diğer farklı yerlerden parametrelerin beyanı: başlıklar, cookies, form alanları ve dosyalar. *Doğrulama kısıtlamaları nasıl "maksimum_uzunluk" veya "normal ifade" olarak ayarlanır.
- Çok güçlü ve kullanımı kolay bir Bağımlılık Enjeksiyonu sistemi olarak da bilinir.
- JWT belirteçleri ve HTTP Basic kimlik doğrulaması ile OAuth2 desteği dahil olmak üzere güvenlik ve kimlik doğrulama.
- Derin yuvalanmış JSON modellerini bildirmek için daha gelişmiş (ancak aynı derecede kolay) teknikler (Pydantic sayesinde).
- GraphQL Çilek ve diğer kitaplıklarla entegrasyon.
- Birçok ekstra özellik (Starlette sayesinde):
- WebSockets
- "istekler" ve "pytest"e dayalı son derece kolay testler
- CORS
- Çerez Oturumları
- ...ve dahası.
Bağımsız TechEmpower karşılaştırmaları, Uvicorn altında çalışan FastAPI uygulamalarını mevcut en hızlı Python çerçevelerinden biri, yalnızca Starlette ve Uvicorn'un altında (dahili olarak FastAPI tarafından kullanılır). (*)
Bununla ilgili daha fazla bilgi edinmek için Karşılaştırmalar bölümüne bakın.
Pydantic tarafından kullanılır:
ujson
- daha hızlı JSON için "ayrıştırma".email_validator
- e-posta doğrulaması için.
Starlette tarafından kullanılır:
istekler
- "TestClient"i kullanmak istiyorsanız gereklidir.jinja2
- Varsayılan şablon yapılandırmasını kullanmak istiyorsanız gereklidir.python-multipart
- Formu desteklemek istiyorsanız gereklidir "ayrıştırma",request.form()
ile.itsdangerous
- "SessionMiddleware" desteği için gereklidir.pyyaml
- Starlette'in "SchemaGenerator" desteği için gereklidir (muhtemelen FastAPI ile).ujson
- "UJSONResponse" kullanmak istiyorsanız gereklidir.
FastAPI / Starlette tarafından kullanılır:
uvicorn
- uygulamanızı yükleyen ve sunan sunucu için. *orjson
- "ORJSONResponse" kullanmak istiyorsanız gereklidir.
Bunların hepsini pip install "fastapi[all]"
ile kurabilirsiniz.
Bu proje MIT lisansı şartlarına göre lisanslanmıştır.