FastAPI ile API Geliştirme: Temel Seviyeden İleri Seviyeye
Bu makale, FastAPI kullanarak API geliştirme sürecini kapsamlı bir şekilde ele almaktadır. Temel kavramlardan başlayarak ileri seviye tekniklere kadar uzanan bu rehber, FastAPI ile güçlü ve ölçeklenebilir API’lar oluşturmanıza yardımcı olacaktır.
İçindekiler
- FastAPI Nedir?
- FastAPI’nin Avantajları
- Kurulum ve Ortam Hazırlığı
- İlk API Endpoint’i Oluşturma
- Veri Doğrulama ve Serileştirme (Pydantic)
- Request Body Kullanımı
- Query Parametreleri
- Path Parametreleri
- Dependency Injection
- Güvenlik ve Kimlik Doğrulama
- Middleware Kullanımı
- Hata Yönetimi
- Asenkron Programlama
- Dokümantasyon ve Otomatik Belgeleme
- Test Yazımı
- Deployment (Yayımlama)
- İleri Seviye Konular
- Sonuç
FastAPI Nedir?
FastAPI, modern, hızlı (yüksek performanslı), web API’leri oluşturmak için kullanılan bir Python web framework’üdür. Python 3.7+ tabanlıdır ve standart Python tipi ipuçlarını kullanır. Hız ve kolaylık ön planda tutularak tasarlanmıştır. FastAPI, otomatik veri doğrulama, serileştirme ve dokümantasyon gibi özellikleri sunar.
FastAPI’nin Avantajları
- Hızlı: Yüksek performanslı, NodeJS ve Go ile rekabet edebilir.
- Kolay: Öğrenmesi ve kullanması kolaydır.
- Az Kod: Boilerplate kod miktarını azaltır.
- Sağlam: Üretim için hazır kod sağlar.
- Standartlara Uygun: OpenAPI ve JSON Schema tabanlıdır.
- Otomatik Dokümantasyon: Swagger UI ve ReDoc ile otomatik API dokümantasyonu sunar.
- Veri Doğrulama: Pydantic ile güçlü veri doğrulama yetenekleri sunar.
Kurulum ve Ortam Hazırlığı
FastAPI’yi kullanmaya başlamadan önce Python 3.7 veya üzeri bir sürüme sahip olduğunuzdan emin olun. Daha sonra aşağıdaki komutları kullanarak FastAPI ve Uvicorn’u (asenkron sunucu) yükleyebilirsiniz:
pip install fastapi uvicorn
Uvicorn, FastAPI uygulamalarını çalıştırmak için kullanılan bir ASGI sunucusudur.
İlk API Endpoint’i Oluşturma
Aşağıdaki örnek kod, basit bir FastAPI uygulamasının nasıl oluşturulacağını ve ilk API endpoint’inin nasıl tanımlanacağını göstermektedir:
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def read_root():
return {"message": "Merhaba Dünya!"}
Bu kodu bir `main.py` dosyasına kaydedin ve aşağıdaki komutu kullanarak uygulamayı çalıştırın:
uvicorn main:app --reload
`–reload` parametresi, kodunuzda yapılan değişiklikleri otomatik olarak algılayarak sunucuyu yeniden başlatır.
Veri Doğrulama ve Serileştirme (Pydantic)
FastAPI, Pydantic kütüphanesi ile entegre olarak veri doğrulama ve serileştirme işlemlerini kolaylaştırır. Pydantic, Python veri sınıflarını kullanarak veri tiplerini tanımlamanıza ve verileri doğrulamanıza olanak tanır.
Örneğin, aşağıdaki gibi bir Pydantic modeli tanımlayabilirsiniz:
from pydantic import BaseModel
class Item(BaseModel):
name: str
description: str | None = None
price: float
tax: float | None = None
Bu modeli API endpoint’lerinde kullanarak gelen verileri doğrulayabilir ve serileştirebilirsiniz.
Request Body Kullanımı
Request body, istemcinin sunucuya gönderdiği verileri içerir. FastAPI, Pydantic modellerini kullanarak request body’lerini kolayca işleyebilir.
Örneğin, aşağıdaki API endpoint’i, bir `Item` modelini request body olarak alır:
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class Item(BaseModel):
name: str
description: str | None = None
price: float
tax: float | None = None
@app.post("/items/")
async def create_item(item: Item):
return item
Query Parametreleri
Query parametreleri, URL’nin sonuna eklenen parametrelerdir. FastAPI, `Query` sınıfını kullanarak query parametrelerini tanımlamanıza olanak tanır.
Örneğin, aşağıdaki API endpoint’i, bir `q` query parametresini alır:
from fastapi import FastAPI, Query
app = FastAPI()
@app.get("/items/")
async def read_items(q: str | None = Query(default=None, max_length=50)):
results = {"items": [{"name": "Foo"}, {"name": "Bar"}]}
if q:
results.update({"q": q})
return results
Path Parametreleri
Path parametreleri, URL’nin içinde yer alan parametrelerdir. FastAPI, path parametrelerini kolayca tanımlamanıza olanak tanır.
Örneğin, aşağıdaki API endpoint’i, bir `item_id` path parametresini alır:
from fastapi import FastAPI
app = FastAPI()
@app.get("/items/{item_id}")
async def read_item(item_id: int):
return {"item_id": item_id}
Dependency Injection
Dependency injection, bağımlılıkları bir sınıfa veya fonksiyona dışarıdan enjekte etme tekniğidir. FastAPI, dependency injection’ı destekler ve bu sayede daha modüler ve test edilebilir kod yazmanıza olanak tanır.
Örneğin, aşağıdaki kod, bir bağımlılığı bir API endpoint’ine enjekte etmektedir:
from fastapi import FastAPI, Depends
app = FastAPI()
async def get_db():
db = FakeDatabase()
try:
yield db
finally:
db.close()
@app.get("/items/")
async def read_items(db: FakeDatabase = Depends(get_db)):
items = db.get_items()
return items
Güvenlik ve Kimlik Doğrulama
FastAPI, çeşitli güvenlik ve kimlik doğrulama mekanizmalarını destekler. Örneğin, API anahtarları, OAuth2 ve JWT (JSON Web Tokens) gibi yöntemleri kullanarak API’lerinizi koruyabilirsiniz.
Detaylı bilgi için FastAPI’nin resmi dokümantasyonuna başvurabilirsiniz.
Middleware Kullanımı
Middleware, isteklerin ve yanıtların işlenmesi sürecine müdahale eden fonksiyonlardır. FastAPI, middleware’ler aracılığıyla istekleri ve yanıtları özelleştirmenize olanak tanır.
Örneğin, aşağıdaki kod, her isteğin ne kadar sürdüğünü loglayan bir middleware örneğidir:
from fastapi import FastAPI, Request
import time
app = FastAPI()
@app.middleware("http")
async def add_process_time_header(request: Request, call_next):
start_time = time.time()
response = await call_next(request)
process_time = time.time() - start_time
response.headers["X-Process-Time"] = str(process_time)
return response
Hata Yönetimi
FastAPI, hata yönetimini kolaylaştırmak için `HTTPException` sınıfını sunar. Bu sınıfı kullanarak özel hata mesajları ve HTTP durum kodları döndürebilirsiniz.
Örneğin, aşağıdaki kod, bir öğenin bulunamadığı durumda bir 404 hatası döndürmektedir:
from fastapi import FastAPI, HTTPException
app = FastAPI()
items = {"foo": {"name": "Foo"}}
@app.get("/items/{item_id}")
async def read_item(item_id: str):
if item_id not in items:
raise HTTPException(status_code=404, detail="Item not found")
return items[item_id]
Asenkron Programlama
FastAPI, asenkron programlamayı destekler. `async` ve `await` anahtar kelimelerini kullanarak asenkron fonksiyonlar tanımlayabilir ve non-blocking işlemler gerçekleştirebilirsiniz. Bu, API’nizin performansını artırmanıza yardımcı olur.
Dokümantasyon ve Otomatik Belgeleme
FastAPI, OpenAPI ve JSON Schema standartlarına uygun olarak otomatik API dokümantasyonu oluşturur. Swagger UI ve ReDoc arayüzleri sayesinde API’nizi kolayca keşfedebilir ve test edebilirsiniz.
Uygulamanızı çalıştırdıktan sonra `/docs` ve `/redoc` adreslerini ziyaret ederek otomatik dokümantasyon arayüzlerine erişebilirsiniz.
Test Yazımı
FastAPI uygulamalarını test etmek için `pytest` gibi test framework’lerini kullanabilirsiniz. FastAPI, test yazımını kolaylaştırmak için `TestClient` sınıfını sunar.
Detaylı bilgi için FastAPI’nin resmi dokümantasyonuna başvurabilirsiniz.
Deployment (Yayımlama)
FastAPI uygulamalarını çeşitli platformlara (örneğin, Heroku, AWS, Google Cloud) yayımlayabilirsiniz. Uvicorn ve Gunicorn gibi sunucularla birlikte Docker kullanarak da uygulamanızı yayımlayabilirsiniz.
İleri Seviye Konular
FastAPI ile ilgili daha ileri seviye konular şunlardır:
- WebSockets
- GraphQL
- Background Tasks
- CORS (Cross-Origin Resource Sharing)
- Custom Exception Handlers
Sonuç
Bu makalede, FastAPI kullanarak API geliştirme sürecinin temel adımlarını ve ileri seviye tekniklerini ele aldık. FastAPI’nin avantajları, kurulumu, temel endpoint’lerin oluşturulması, veri doğrulama, güvenlik, dokümantasyon ve test yazımı gibi konuları detaylı bir şekilde inceledik. FastAPI, hızlı, kolay ve güçlü API’lar oluşturmak için ideal bir framework’tür.