FastAPI ile Güçlü API Geliştirmenin Püf Noktaları
Günümüzde modern web uygulamaları ve mikroservis mimarileri için hızlı, güvenilir ve ölçeklenebilir API’ler geliştirmek kritik öneme sahiptir. İşte tam bu noktada FastAPI devreye giriyor. FastAPI, Python tabanlı, yüksek performanslı bir web framework’üdür ve API geliştirmeyi kolaylaştırmak için tasarlanmıştır. Bu makalede, FastAPI ile güçlü API’ler geliştirmenin püf noktalarını detaylı bir şekilde inceleyeceğiz.
İçindekiler
- FastAPI’ye Giriş
- FastAPI’nin Avantajları
- Kurulum ve Temel Kullanım
- Veri Doğrulama ve Serileştirme
- Asenkron Programlama
- Bağımlılık Yönetimi
- Güvenlik Önlemleri
- Test Etme
- Dokümantasyon
- Performans Optimizasyonu
- Örnek Proje
- Sonuç
1. FastAPI’ye Giriş
FastAPI, Guido van Rossum’un Python’u baz alarak geliştirilmiş, modern ve yüksek performanslı bir web framework’üdür. Temel amacı, API geliştirme sürecini hızlandırmak ve kolaylaştırmaktır. Özellikle veri serileştirme, doğrulama ve dokümantasyon gibi konularda sağladığı kolaylıklar sayesinde geliştiricilerin iş yükünü önemli ölçüde azaltır. FastAPI, açık kaynaklı ve MIT lisansı ile dağıtılmaktadır.
2. FastAPI’nin Avantajları
- Hız ve Performans: ASGI (Asynchronous Server Gateway Interface) desteği sayesinde yüksek performans sunar.
- Veri Doğrulama: Pydantic ile entegre olarak güçlü veri doğrulama özellikleri sağlar.
- Otomatik Dokümantasyon: OpenAPI ve Swagger UI ile otomatik API dokümantasyonu oluşturur.
- Tip İpuçları (Type Hints): Python’un tip ipuçlarını kullanarak kodun okunabilirliğini ve güvenilirliğini artırır.
- Bağımlılık Yönetimi: Basit ve etkili bağımlılık yönetimi sistemi sunar.
- Kolay Öğrenme: Basit ve anlaşılır sözdizimi sayesinde kolayca öğrenilebilir.
3. Kurulum ve Temel Kullanım
FastAPI’yi kullanmaya başlamak için öncelikle Python’un kurulu olduğundan emin olun. Ardından aşağıdaki komutları kullanarak FastAPI ve Uvicorn’u (bir ASGI sunucusu) kurabilirsiniz:
pip install fastapi uvicorn
Temel bir FastAPI uygulaması şu şekilde oluşturulabilir:
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def read_root():
return {"Hello": "World"}
Bu uygulamayı çalıştırmak için aşağıdaki komutu kullanın:
uvicorn main:app --reload
Burada main
, Python dosyanızın adıdır ve app
ise FastAPI uygulamasının adıdır. --reload
parametresi, kodunuzda değişiklik yaptığınızda sunucunun otomatik olarak yeniden başlatılmasını sağlar.
4. Veri Doğrulama ve Serileştirme
FastAPI, Pydantic kütüphanesi ile entegre olarak veri doğrulama ve serileştirme işlemlerini kolaylaştırır. Pydantic, veri tiplerini tanımlamanıza ve verilerin doğru formatta olduğundan emin olmanıza olanak tanı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
Bu örnekte, Item
adında bir Pydantic modeli tanımladık. Bu model, name
, description
, price
ve tax
alanlarına sahiptir. FastAPI, gelen verileri otomatik olarak bu modele göre doğrular ve serileştirir.
5. Asenkron Programlama
FastAPI, asenkron programlama desteği sayesinde yüksek performanslı uygulamalar geliştirmenize olanak tanır. Asenkron fonksiyonlar, bir işlem tamamlanana kadar diğer işlemlerin devam etmesini sağlar, böylece uygulamanızın tepki süresi kısalır.
from fastapi import FastAPI
import asyncio
app = FastAPI()
async def some_long_operation():
await asyncio.sleep(5)
return {"message": "Operation completed"}
@app.get("/long-operation/")
async def long_operation_route():
result = await some_long_operation()
return result
Bu örnekte, some_long_operation
adında bir asenkron fonksiyon tanımladık. Bu fonksiyon, 5 saniye bekledikten sonra bir mesaj döndürür. FastAPI, bu fonksiyonu asenkron olarak çalıştırır ve diğer işlemlerin devam etmesini sağlar.
6. Bağımlılık Yönetimi
FastAPI, bağımlılık yönetimi için güçlü bir sistem sunar. Bağımlılıklar, fonksiyonlara parametre olarak enjekte edilir ve FastAPI, bu bağımlılıkları otomatik olarak çözer.
from fastapi import FastAPI, Depends
app = FastAPI()
def get_db():
db = {"items": []}
try:
yield db
finally:
pass
@app.get("/items/")
async def read_items(db: dict = Depends(get_db)):
return db["items"]
Bu örnekte, get_db
adında bir bağımlılık fonksiyonu tanımladık. Bu fonksiyon, bir veritabanı bağlantısı oluşturur ve bu bağlantıyı döndürür. FastAPI, read_items
fonksiyonuna bu bağımlılığı otomatik olarak enjekte eder.
7. Güvenlik Önlemleri
FastAPI ile API geliştirirken güvenlik önlemleri almak önemlidir. İşte bazı temel güvenlik önlemleri:
- Kimlik Doğrulama (Authentication): Kullanıcıların kimliklerini doğrulamak için OAuth2 veya JWT gibi yöntemler kullanın.
- Yetkilendirme (Authorization): Kullanıcıların hangi kaynaklara erişebileceğini belirlemek için rol tabanlı erişim kontrolü (RBAC) kullanın.
- Veri Doğrulama: Gelen verileri doğrulamak için Pydantic veya benzeri kütüphaneler kullanın.
- Girdi Temizleme (Input Sanitization): Kullanıcı girdilerini temizleyerek SQL enjeksiyonu veya XSS gibi saldırıları önleyin.
- HTTPS Kullanımı: Verilerin güvenli bir şekilde iletilmesini sağlamak için HTTPS kullanın.
8. Test Etme
FastAPI uygulamalarını test etmek için pytest ve httpx gibi kütüphaneler kullanabilirsiniz. Testler, uygulamanızın doğru çalıştığından emin olmanıza ve hataları erken aşamada tespit etmenize yardımcı olur.
from fastapi.testclient import TestClient
from .main import app
client = TestClient(app)
def test_read_main():
response = client.get("/")
assert response.status_code == 200
assert response.json() == {"Hello": "World"}
Bu örnekte, TestClient
kullanarak FastAPI uygulamasını test ediyoruz. test_read_main
fonksiyonu, kök endpoint’e bir GET isteği gönderir ve yanıtın doğru olup olmadığını kontrol eder.
9. Dokümantasyon
FastAPI, OpenAPI ve Swagger UI ile otomatik API dokümantasyonu oluşturur. Bu sayede, API’nizi kullanan geliştiriciler için güncel ve anlaşılır bir dokümantasyon sunabilirsiniz.
API dokümantasyonuna erişmek için uygulamanızı çalıştırdıktan sonra /docs
veya /redoc
endpoint’lerini ziyaret edebilirsiniz.
10. Performans Optimizasyonu
FastAPI uygulamalarının performansını artırmak için aşağıdaki yöntemleri kullanabilirsiniz:
- Asenkron Programlama: Asenkron fonksiyonlar kullanarak uygulamanızın tepki süresini kısaltın.
- Veritabanı Optimizasyonu: Veritabanı sorgularını optimize edin ve indeksler kullanın.
- Önbellekleme (Caching): Sık erişilen verileri önbelleğe alarak veritabanı yükünü azaltın.
- Gzip Sıkıştırması: Yanıtları sıkıştırarak ağ trafiğini azaltın.
- Uvicorn ve Gunicorn Kullanımı: Uvicorn ve Gunicorn gibi yüksek performanslı sunucular kullanarak uygulamanızın performansını artırın.
11. Örnek Proje
Aşağıda, FastAPI ile basit bir TODO listesi API’si örneği bulunmaktadır:
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from typing import List
app = FastAPI()
class Todo(BaseModel):
id: int
title: str
completed: bool = False
todos: List[Todo] = []
@app.get("/todos/", response_model=List[Todo])
async def list_todos():
return todos
@app.post("/todos/", response_model=Todo)
async def create_todo(todo: Todo):
todos.append(todo)
return todo
@app.get("/todos/{todo_id}", response_model=Todo)
async def read_todo(todo_id: int):
for todo in todos:
if todo.id == todo_id:
return todo
raise HTTPException(status_code=404, detail="Todo not found")
@app.put("/todos/{todo_id}", response_model=Todo)
async def update_todo(todo_id: int, updated_todo: Todo):
for i, todo in enumerate(todos):
if todo.id == todo_id:
todos[i] = updated_todo
return updated_todo
raise HTTPException(status_code=404, detail="Todo not found")
@app.delete("/todos/{todo_id}", response_model=dict)
async def delete_todo(todo_id: int):
for i, todo in enumerate(todos):
if todo.id == todo_id:
del todos[i]
return {"message": "Todo deleted"}
raise HTTPException(status_code=404, detail="Todo not found")
Bu örnek, temel CRUD (Create, Read, Update, Delete) işlemlerini içeren bir TODO listesi API’sini göstermektedir.
12. Sonuç
FastAPI, modern ve yüksek performanslı API’ler geliştirmenize olanak tanıyan güçlü bir framework’tür. Veri doğrulama, otomatik dokümantasyon, asenkron programlama ve bağımlılık yönetimi gibi özellikleriyle geliştirme sürecini kolaylaştırır ve hızlandırır. Bu makalede, FastAPI ile güçlü API’ler geliştirmenin püf noktalarını detaylı bir şekilde inceledik. Artık siz de FastAPI’yi kullanarak harika API’ler geliştirebilirsiniz.