Python web geliştirme alanında hızla değişen ortamda, hız, tür güvenliği ve geliştirici deneyimi hayati önem kazanmıştır. Django ve Flask uzun süredir sahada hakimiyet sürerken, FastAPI, API'ler oluşturmak için yüksek performanslı, kurumsal düzeyde bir web çerçevesi olarak öne çıkmıştır. Standart Python tür ipuçlarını ve modern asenkron yetenekleri kullanarak FastAPI, geliştiricilerin minimum iskelet kodla sağlam sistemler oluşturmasına olanak tanır.
Bu yazı, FastAPI kullanarak üretim düzeyine hazır REST API'leri oluşturmak için gereken temel mimari desenleri, en iyi uygulamaları ve pratik uygulamaları incelemektedir. Bağımlılık enjeksiyonu, veri doğrulama ve asenkron performans optimizasyonunu tartışmak için temel eğitimlerin ötesine geçeceğiz.
Neden FastAPI Seçmelisiniz?
FastAPI, web kısımları için Starlette ve veri ayrıştırma ve doğrulama kısımları için Pydantic üzerine inşa edilmiştir. Bu kombinasyon, geleneksel çerçevelere kıyasla birkaç ayrıcalıklı avantaj sunar:
- Yüksek Performans: Asenkron desteği ve yerel Starlette altyapısı sayesinde, mevcut en hızlı Python çerçevelerinden biridir ve NodeJS ile Go ile rekabet eder.
- Otomatik Belgelleme: Kodunuzdan ve tür ipuçlarınızdan yola çıkarak OpenAPI (Swagger UI ve ReDoc) belgelerini otomatik olarak oluşturur; ayrı belgelendirme araçlarına duyulan ihtiyacı ortadan kaldırır.
- Tür Güvenliği: Python tür ipuçlarına dayanarak FastAPI, otomatik veri dönüştürme, doğrulama ve belgelendirme oluşturma sağlar.
Uygulamanızı Yapılandırma
Orta ve ileri düzey geliştiriciler için tek dosyalı bir uygulama yetersizdir. Bakılabilirlik için yönlendiriciler kullanan modüler bir yapı esastır. Standart bir dizin yapısını ve uygulamayı inceleyelim.
Rotaların ayrı dosyalara ayrıldığı modül tabanlı bir yaklaşımı ele alalım. İşte FastAPI kullanan temel bir API uç noktası örneği:
from fastapi import FastAPI, Depends, HTTPException
from pydantic import BaseModel
from typing import List, Optional
app = FastAPI(title="User Management API", version="1.0.0")
# İstek/yanıt doğrulaması için Pydantic modelleri tanımlayın
class UserBase(BaseModel):
email: str
username: str
full_name: Optional[str] = None
class UserCreate(UserBase):
password: str
class UserResponse(UserBase):
user_id: int
class Config:
from_attributes = True
# Demonstrasyon amaçlı bellek içi depolama
fake_users_db = {}
current_user_id = 0
# Veritabanı oturumlarını veya kimlik doğrulama kontrollerini simüle etmek için bağımlılık
def get_db_session():
# Gerçek bir uygulamada bu bir veritabanı oturumu döndürür
return {"status": "connected"}
@app.post("/users/", response_model=UserResponse, status_code=201)
async def create_user(user: UserCreate, db = Depends(get_db_session)):
"""
Yeni bir kullanıcı oluşturur. Girdiyi Pydantic kullanarak doğrular.
"""
global current_user_id
current_user_id += 1
# Yineleyen e-posta kontrolü
if user.email in fake_users_db:
raise HTTPException(status_code=400, detail="E-posta zaten kayıtlı")
user_data = UserResponse(
user_id=current_user_id,
email=user.email,
username=user.username,
full_name=user.full_name
)
fake_users_db[user.email] = user_data
return user_data
@app.get("/users/", response_model=List[UserResponse])
def read_users(skip: int = 0, limit: int = 10):
"""
Sayfalama desteğiyle bir kullanıcı listesi getirir.
"""
users = list(fake_users_db.values())
return users[skip : skip + limit]
Veri Bütünlüğü İçin Pydantic'ın Gücünü Kullanma
FastAPI'nin doğrulama motorunun kalbi Pydantic'tır. Flask'ta JSON'u manuel olarak ayrıştırıp alanları doğrulayabileceğiniz gibi, FastAPI verinizin beklenen şeklini tanımlamak için Pydantic modellerini kullanır. Bu, yalnızca geçerli verilerin uygulama mantığınıza girmesini sağlar.
Kullanılması gereken temel özellikler şunlardır:
- Alan Doğrulama: Minimum uzunluklar, regex desenleri veya varsayılan değerler ayarlamak için
Field()kullanın. - Özel Doğrulayıcılar: Özel iş mantığı doğrulama kuralları eklemek için
@validatorveya@field_validatordekoratörlerini uygulayın. - Yapılandırma Sınıfları: Ek alanlara izin verme veya seri hale getirme kuralları belirleme gibi Pydantic model davranışını yapılandırın.
Asenkron En İyi Uygulamalar
FastAPI yerel async ve await sözdizimini destekler. Asenkron uç noktalar kullanırken engelleme işlemlerinden kaçınmak çok önemlidir. Bir veritabanıyla veya harici bir API ile etkileşim kuruyorsanız, engelleme dışı G/Ç'yi korumak için asenkron kütüphaneler (asyncpg (PostgreSQL için) veya httpx (HTTP istekleri için) gibi) kullanın.
Örneğin, harici bir hizmete çağrı yaparken şunu tercih edin:
import httpx
from fastapi import HTTPException
async def get_external_data(url: str):
async with httpx.AsyncClient() as client:
try:
response = await client.get(url)
response.raise_for_status()
return response.json()
except httpx.HTTPStatusError as e:
raise HTTPException(status_code=e.response.status_code, detail=e.response.text)
Bununla birlikte, CPU yoğun görevlerle dikkatli olun. Ağır hesaplama yapıyorsanız, olay döngüsünü engellememek için görevi bir iş parçacığı havuzuna devretmek için run_in_executor kullanmayı düşünün.
Sonuç
FastAPI, Python API geliştirme için önemli bir sıçrama temsil eder. Python'un tanıdıklığını asenkron çerçevelerin performansı ve tür güvenli doğrulamanın titizliği ile birleştirerek geliştiricilerin ölçeklenebilir, güvenli ve iyi belgelenmiş uygulamalar oluşturmasına olanak tanır. Flask veya Django'dan geçiş yapan geliştiriciler için öğrenme eğrisi yönetilebilir düzeydedir ve bakılabilirlik ile performans açısından uzun vadeli faydaları büyüktür. Tür ipuçlarını Pydantic modellerinize entegre etmeye başlayın, daha temiz kod için bağımlılık enjeksiyonundan yararlanın ve FastAPI'nin potansiyelini tam olarak açığa çıkarmak için asenkron ekosistemi benimseyin.