FastAPI
FastAPI framework, yüksek performanslı, öğrenmesi kolay, geliştirmesi hızlı, kullanıma sunulmaya hazır.
dokümantasyon: https://fastapi.tiangolo.com
Kaynak kodu: https://github.com/tiangolo/fastapi
FastAPI, Python 3.6+'nın standart type hintlerine dayanan modern ve hızlı (yüksek performanslı) API'lar oluşturmak için kullanılabilecek web framework'ü.
Ana özellikleri:
- Hızlı: çok yüksek performanslı, NodeJS ve Go ile eşdeğer seviyede performans sağlıyor, (Starlette ve Pydantic sayesinde.) Python'un en hızlı frameworklerinden bir tanesi..
- Kodlaması hızlı: Yeni özellikler geliştirmek neredeyse %200 - %300 daha hızlı. *
- Daha az bug: Geliştirici (insan) kaynaklı hatalar neredeyse %40 azaltıldı. *
- Sezgileri güçlü: Editor (otomatik-tamamlama) desteği harika. Otomatik tamamlama her yerde. Debuglamak ile daha az zaman harcayacaksınız.
- Kolay: Öğrenmesi ve kullanması kolay olacak şekilde. Doküman okumak için harcayacağınız süre azaltıldı.
- Kısa: Kod tekrarını minimuma indirdik. Fonksiyon parametrelerinin tiplerini belirtmede farklı yollar sunarak karşılaşacağınız bug'ları azalttık.
-
Güçlü: Otomatik dokümantasyon ile beraber, kullanıma hazır kod yaz.
-
Standartlar belirli: Tamamiyle API'ların açık standartlara bağlı ve (tam uyumlululuk içerisinde); OpenAPI (eski adıyla Swagger) ve JSON Schema.
* Bahsi geçen rakamsal ifadeler tamamiyle, geliştirme takımının kendi sundukları ürünü geliştirirken yaptıkları testlere dayanmakta.
Sponsors¶
Görüşler¶
"[...] Bugünlerde FastAPI'ı çok fazla kullanıyorum [...] Aslına bakarsanız Microsoft'taki Machine Learning servislerimizin hepsinde kullanmayı düşünüyorum. FastAPI ile geliştirdiğimiz servislerin bazıları çoktan Windows'un ana ürünlerine ve Office ürünlerine entegre edilmeye başlandı bile."
"FastAPI'ı tahminlerimiz'i sorgulanabilir hale getirmek için REST mimarisı ile beraber server üzerinde kullanmaya başladık."
"Netflix kriz yönetiminde orkestrasyon yapabilmek için geliştirdiği yeni framework'ü Dispatch'in, açık kaynak versiyonunu paylaşmaktan gurur duyuyor. [FastAPI ile yapıldı.]"
"FastAPI için ayın üzerindeymişcesine heyecanlıyım. Çok eğlenceli!"
"Dürüst olmak gerekirse, geliştirdiğin şey bir çok açıdan çok sağlam ve parlak gözüküyor. Açıkcası benim Hug'ı tasarlarken yapmaya çalıştığım şey buydu - bunu birisinin başardığını görmek gerçekten çok ilham verici."
"Eğer REST API geliştirmek için modern bir framework öğrenme arayışında isen, FastAPI'a bir göz at [...] Hızlı, kullanımı ve öğrenmesi kolay. [...]"
"Biz API servislerimizi FastAPI'a geçirdik [...] Sizin de beğeneceğinizi düşünüyoruz. [...]"
Typer, komut satırı uygulamalarının FastAPI'ı¶
Eğer API yerine komut satırı uygulaması geliştiriyor isen Typer'a bir göz at.
Typer kısaca FastAPI'ın küçük kız kardeşi. Komut satırı uygulamalarının FastAPI'ı olması hedeflendi. ⌨️ 🚀
Gereksinimler¶
Python 3.7+
FastAPI iki devin omuzları üstünde duruyor:
Yükleme¶
$ pip install fastapi
---> 100%
Uygulamanı kullanılabilir hale getirmek için Uvicorn ya da Hypercorn gibi bir ASGI serverına ihtiyacın olacak.
$ pip install "uvicorn[standard]"
---> 100%
Örnek¶
Şimdi dene¶
main.py
adında bir dosya oluştur :
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}
Ya da async def
...
Eğer kodunda async
/ await
var ise, async def
kullan:
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:
Eğer ne olduğunu bilmiyor isen "Acelen mi var?" kısmını oku async
ve await
.
Çalıştır¶
Serverı aşağıdaki komut ile çalıştır:
$ 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.
Çalıştırdığımız uvicorn main:app --reload
hakkında...
uvicorn main:app
şunları ifade ediyor:
main
: dosya olanmain.py
(yani Python "modülü").app
: isemain.py
dosyasının içerisinde oluşturduğumuzapp = FastAPI()
'a denk geliyor.--reload
: ise kodda herhangi bir değişiklik yaptığımızda serverın yapılan değişiklerileri algılayıp, değişiklikleri siz herhangi bir şey yapmadan uygulamasını sağlıyor.
Dokümantasyonu kontrol et¶
Browserını aç ve şu linke git http://127.0.0.1:8000/items/5?q=somequery.
Bir JSON yanıtı göreceksin:
{"item_id": 5, "q": "somequery"}
Az önce oluşturduğun API:
/
ve/items/{item_id}
adreslerine HTTP talebi alabilir hale geldi.- İki adresde
GET
operasyonlarını (HTTP metodları olarakta bilinen) yapabilir hale geldi. /items/{item_id}
adresi ayrıca biritem_id
adres parametresine sahip ve bu birint
olmak zorunda./items/{item_id}
adresi opsiyonel birstr
sorgu paramtersine sahip bu daq
.
İnteraktif API dokümantasyonu¶
Şimdi http://127.0.0.1:8000/docs adresine git.
Senin için otomatik oluşturulmuş(Swagger UI tarafından sağlanan) interaktif bir API dokümanı göreceksin:
Alternatif API dokümantasyonu¶
Şimdi http://127.0.0.1:8000/redoc adresine git.
Senin için alternatif olarak (ReDoc tarafından sağlanan) bir API dokümantasyonu daha göreceksin:
Örnek bir değişiklik¶
Şimdi main.py
dosyasını değiştirelim ve body ile PUT
talebi alabilir hale getirelim.
Şimdi Pydantic sayesinde, Python'un standart tiplerini kullanarak bir body tanımlayacağız.
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 otomatik olarak yeniden başlamalı (çünkü yukarıda uvicorn
'u çalıştırırken --reload
parametresini kullandık.).
İnteraktif API dokümantasyonu'nda değiştirme yapmak¶
Şimdi http://127.0.0.1:8000/docs bağlantısına tekrar git.
- İnteraktif API dokümantasyonu, yeni body ile beraber çoktan yenilenmiş olması lazım:
- "Try it out"a tıkla, bu senin API parametleri üzerinde deneme yapabilmene izin veriyor:
- Şimdi "Execute" butonuna tıkla, kullanıcı arayüzü otomatik olarak API'ın ile bağlantı kurarak ona bu parametreleri gönderecek ve sonucu karşına getirecek.
Alternatif API dokümantasyonunda değiştirmek¶
Şimdi ise http://127.0.0.1:8000/redoc adresine git.
- Alternatif dokümantasyonda koddaki değişimler ile beraber kendini yeni query ve body ile güncelledi.
Özet¶
Özetleyecek olursak, URL, sorgu veya request body'deki parametrelerini fonksiyon parametresi olarak kullanıyorsun. Bu parametrelerin veri tiplerini bir kere belirtmen yeterli.
Type-hinting işlemini Python dilindeki standart veri tipleri ile yapabilirsin
Yeni bir syntax'e alışmana gerek yok, metodlar ve classlar zaten spesifik kütüphanelere ait.
Sadece standart Python 3.6+.
Örnek olarak, int
tanımlamak için:
item_id: int
ya da daha kompleks Item
tipi:
item: Item
...sadece kısa bir parametre tipi belirtmekle beraber, sahip olacakların:
- Editör desteği dahil olmak üzere:
- Otomatik tamamlama.
- Tip sorguları.
- Datanın tipe uyumunun sorgulanması:
- Eğer data geçersiz ise, otomatik olarak hataları ayıklar.
- Çok derin JSON objelerinde bile veri tipi sorgusu yapar.
- Gelen verinin dönüşümünü aşağıdaki veri tiplerini kullanarak gerçekleştirebiliyor.
- JSON.
- Path parametreleri.
- Query parametreleri.
- Cookies.
- Headers.
- Forms.
- Files.
- Giden verinin dönüşümünü aşağıdaki veri tiplerini kullanarak gerçekleştirebiliyor (JSON olarak):
- Python tiplerinin (
str
,int
,float
,bool
,list
, vs) çevirisi. datetime
objesi.UUID
objesi.- Veritabanı modelleri.
- ve daha fazlası...
- Python tiplerinin (
- 2 alternatif kullanıcı arayüzü dahil olmak üzere, otomatik interaktif API dokümanu:
- Swagger UI.
- ReDoc.
Az önceki kod örneğine geri dönelim, FastAPI'ın yapacaklarına bir bakış atalım:
item_id
'ninGET
vePUT
talepleri içinde olup olmadığının doğruluğunu kontol edecek.item_id
'nin tipininint
olduğunuGET
vePUT
talepleri içinde olup olmadığının doğruluğunu kontol edecek.- Eğer
GET
vePUT
içinde yok ise veint
değil ise, sebebini belirten bir hata mesajı gösterecek
- Eğer
- Opsiyonel bir
q
parametresininGET
talebi için (http://127.0.0.1:8000/items/foo?q=somequery
içinde) olup olmadığını kontrol edecekq
parametresini= None
ile oluşturduğumuz için, opsiyonel bir parametre olacak.- Eğer
None
olmasa zorunlu bir parametre olacak idi (bu yüzden body'dePUT
parametresi var).
PUT
talebi için/items/{item_id}
'nin body'sini, JSON olarak okuyor:name
adında bir parametetre olup olmadığını ve var ise onunstr
olup olmadığını kontol ediyor.price
adında bir parametetre olup olmadığını ve var ise onunfloat
olup olmadığını kontol ediyor.is_offer
adında bir parametetre olup olmadığını ve var ise onunbool
olup olmadığını kontol ediyor.- Bunların hepsini en derin JSON modellerinde bile yapacaktır.
- Bütün veri tiplerini otomatik olarak JSON'a çeviriyor veya tam tersi.
- Her şeyi dokümanlayıp, çeşitli yerlerde:
- İnteraktif dokümantasyon sistemleri.
- Otomatik alıcı kodu üretim sistemlerinde ve çeşitli dillerde.
- İki ayrı web arayüzüyle direkt olarak interaktif bir dokümantasyon sunuyor.
Henüz yüzeysel bir bakış attık, fakat sen çoktan çalışma mantığını anladın.
Şimdi aşağıdaki satırı değiştirmeyi dene:
return {"item_name": item.name, "item_id": item_id}
...bundan:
... "item_name": item.name ...
...buna:
... "item_price": item.price ...
...şimdi editör desteğinin nasıl veri tiplerini bildiğini ve otomatik tamamladığını gör:
Daha fazla örnek ve özellik için Tutorial - User Guide sayfasını git.
Spoiler: Öğretici - Kullanıcı rehberi şunları içeriyor:
- Parameterlerini nasıl headers, cookies, form fields ve files olarak deklare edebileceğini.
maximum_length
ya daregex
gibi şeylerle nasıl doğrulama yapabileceğini.- Çok güçlü ve kullanımı kolay Zorunluluk Entegrasyonu oluşturmayı.
- Güvenlik ve kimlik doğrulama, JWT tokenleri'yle beraber OAuth2 desteği, ve HTTP Basic doğrulaması.
- İleri seviye fakat ona göre oldukça basit olan derince oluşturulmuş JSON modelleri (Pydantic sayesinde).
- Diğer ekstra özellikler (Starlette sayesinde):
- WebSockets
- GraphQL
- HTTPX ve
pytest
sayesinde aşırı kolay testler. - CORS
- Cookie Sessions
- ...ve daha fazlası.
Performans¶
Bağımsız TechEmpower kıyaslamaları gösteriyor ki, Uvicorn'la beraber çalışan FastAPI uygulamaları Python'un en hızlı frameworklerinden birisi , sadece Starlette ve Uvicorn'dan daha yavaş ki FastAPI bunların üzerine kurulu.
Daha fazla bilgi için, bu bölüme bir göz at Benchmarks.
Opsiyonel gereksinimler¶
Pydantic tarafında kullanılan:
email_validator
- email doğrulaması için.
Starlette tarafında kullanılan:
httpx
- EğerTestClient
kullanmak istiyorsan gerekli.jinja2
- Eğer kendine ait template konfigürasyonu oluşturmak istiyorsan gereklipython-multipart
- Form kullanmak istiyorsan gerekli ("dönüşümü").itsdangerous
-SessionMiddleware
desteği için gerekli.pyyaml
-SchemaGenerator
desteği için gerekli (Muhtemelen FastAPI kullanırken ihtiyacınız olmaz).graphene
-GraphQLApp
desteği için gerekli.ujson
-UJSONResponse
kullanmak istiyorsan gerekli.
Hem FastAPI hem de Starlette tarafından kullanılan:
uvicorn
- oluşturduğumuz uygulamayı bir web sunucusuna servis etmek için gerekliorjson
-ORJSONResponse
kullanmak istiyor isen gerekli.
Bunların hepsini pip install fastapi[all]
ile yükleyebilirsin.
Lisans¶
Bu proje, MIT lisansı şartlarına göre lisanslanmıştır.