Ana içeriğe geç

FastAPI

FastAPI

FastAPI framework, yüksek performanslı, öğrenmesi kolay, geliştirmesi hızlı, kullanıma sunulmaya hazır.

Test Coverage Package version


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

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

Kabir Khan - Microsoft (ref)

"FastAPItahminlerimiz'i sorgulanabilir hale getirmek için REST mimarisı ile beraber server üzerinde kullanmaya başladık."

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

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

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

"FastAPI için ayın üzerindeymişcesine heyecanlıyım. Çok eğlenceli!"

Brian Okken - Python Bytes podcast host (ref)

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

Timothy Crosley - Hug'ın Yaratıcısı (ref)

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

Ines Montani - Matthew Honnibal - Explosion AI kurucuları - spaCy yaratıcıları (ref) - (ref)

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 olan main.py (yani Python "modülü").
  • app: ise main.py dosyasının içerisinde oluşturduğumuz app = 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 bir item_id adres parametresine sahip ve bu bir int olmak zorunda.
  • /items/{item_id} adresi opsiyonel bir str sorgu paramtersine sahip bu da q.

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

Swagger UI

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:

ReDoc

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

Swagger UI

  • "Try it out"a tıkla, bu senin API parametleri üzerinde deneme yapabilmene izin veriyor:

Swagger UI interaction

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

Swagger UI interaction

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.

ReDoc

Ö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ı...
  • 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'nin GET ve PUT talepleri içinde olup olmadığının doğruluğunu kontol edecek.
  • item_id'nin tipinin int olduğunu GET ve PUT talepleri içinde olup olmadığının doğruluğunu kontol edecek.
    • Eğer GET ve PUT içinde yok ise ve int değil ise, sebebini belirten bir hata mesajı gösterecek
  • Opsiyonel bir q parametresinin GET talebi için (http://127.0.0.1:8000/items/foo?q=somequery içinde) olup olmadığını kontrol edecek
    • q 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'de PUT 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 onun str olup olmadığını kontol ediyor.
    • price adında bir parametetre olup olmadığını ve var ise onun float olup olmadığını kontol ediyor.
    • is_offer adında bir parametetre olup olmadığını ve var ise onun bool 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:

editor support

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 da regex 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:

Starlette tarafında kullanılan:

  • httpx - Eğer TestClient kullanmak istiyorsan gerekli.
  • jinja2 - Eğer kendine ait template konfigürasyonu oluşturmak istiyorsan gerekli
  • python-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 gerekli
  • orjson - 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.