FastAPI ile Hızlı ve Etkili Todo List API Geliştirme
Günümüzde API’ler, modern web ve mobil uygulamalarının temel yapı taşlarından biri haline geldi. Özellikle mikroservis mimarisi ve dağıtık sistemlerin yaygınlaşmasıyla birlikte, hızlı, güvenilir ve kolay geliştirilebilir API’lere olan ihtiyaç da arttı. İşte tam bu noktada, Python dünyasının parlayan yıldızı FastAPI devreye giriyor. Bu makalede, FastAPI kullanarak nasıl etkili bir Todo List API’si geliştirebileceğinizi adım adım inceleyeceğiz.
İçindekiler
- FastAPI Nedir?
- Neden FastAPI? Avantajları Nelerdir?
- Gereksinimler ve Kurulum
- Proje Yapısı
- Veri Modelleri Oluşturma (Pydantic)
- API Endpoint’lerini Tanımlama
- Veri Tabanı Entegrasyonu (SQLAlchemy)
- CRUD İşlemleri (Create, Read, Update, Delete)
- API’yi Test Etme
- Otomatik Dokümantasyon (Swagger UI ve ReDoc)
- Sonuç
FastAPI Nedir?
FastAPI, Python 3.7+ tabanlı, modern ve yüksek performanslı bir web framework’üdür. Philippe Fanaro tarafından geliştirilen FastAPI, geliştirme sürecini hızlandırmak, daha az kod yazmak ve daha güvenilir API’ler oluşturmak amacıyla tasarlanmıştır. Açık kaynaklıdır ve MIT lisansı altında yayınlanmaktadır.
Neden FastAPI? Avantajları Nelerdir?
- Hızlı Geliştirme: Bağımlılık enjeksiyonu, otomatik veri validasyonu ve seri hale getirme gibi özellikler sayesinde geliştirme süresini önemli ölçüde kısaltır.
- Yüksek Performans: Starlette ve Pydantic gibi güçlü kütüphaneler üzerine inşa edilmiştir, bu da yüksek performanslı API’ler oluşturmanızı sağlar.
- Otomatik Veri Validasyonu: Pydantic ile entegre çalışarak, gelen verilerin otomatik olarak validasyonunu sağlar.
- Otomatik Dokümantasyon: Swagger UI ve ReDoc entegrasyonu sayesinde, API’nizin otomatik olarak dokümante edilmesini sağlar. Bu, hem geliştiriciler hem de API’yi kullananlar için büyük kolaylık sağlar.
- Tip İpuçları (Type Hints): Python’un tip ipuçlarını kullanarak, kodunuzun daha okunabilir ve bakımı kolay olmasını sağlar. Ayrıca, IDE’lerin daha iyi otomatik tamamlama ve hata kontrolü yapmasına olanak tanır.
- Bağımlılık Enjeksiyonu: FastAPI’nin bağımlılık enjeksiyonu sistemi, kodunuzun daha modüler ve test edilebilir olmasını sağlar.
Gereksinimler ve Kurulum
FastAPI ile Todo List API’si geliştirmeye başlamadan önce, aşağıdaki gereksinimleri karşıladığınızdan emin olun:
- Python 3.7 veya üzeri
- pip (Python paket yöneticisi)
Gerekli paketleri yüklemek için aşağıdaki komutu kullanın:
pip install fastapi uvicorn SQLAlchemy databases python-dotenv
Bu komut, FastAPI, ASGI sunucusu olarak Uvicorn, veri tabanı işlemleri için SQLAlchemy, asenkron veri tabanı işlemleri için databases ve ortam değişkenleri için python-dotenv paketlerini yükleyecektir.
Proje Yapısı
Projenizi düzenli tutmak için aşağıdaki gibi bir proje yapısı oluşturabilirsiniz:
todo_api/
├── main.py
├── models.py
├── database.py
├── .env
└── README.md
main.py
: API endpoint’lerinin tanımlandığı ana dosya.models.py
: Veri modellerinin (Pydantic modelleri) tanımlandığı dosya.database.py
: Veri tabanı bağlantısı ve işlemlerinin tanımlandığı dosya..env
: Veri tabanı bağlantı bilgileri gibi hassas bilgilerin saklandığı dosya.README.md
: Proje hakkında genel bilgilerin ve kurulum talimatlarının bulunduğu dosya.
Veri Modelleri Oluşturma (Pydantic)
models.py
dosyasında, Todo List öğelerini temsil edecek Pydantic modellerini tanımlayalım:
from pydantic import BaseModel
from typing import Optional
class Todo(BaseModel):
id: Optional[int] = None
title: str
description: Optional[str] = None
completed: bool = False
class TodoCreate(BaseModel):
title: str
description: Optional[str] = None
Bu modeller, Todo öğelerinin nasıl görüneceğini ve hangi alanları içereceğini tanımlar. Todo
modeli, tüm alanları (id, title, description, completed) içerirken, TodoCreate
modeli sadece oluşturma sırasında gerekli olan alanları (title, description) içerir.
API Endpoint’lerini Tanımlama
main.py
dosyasında, API endpoint’lerini tanımlayalım. Bu endpoint’ler, Todo List öğelerini oluşturma, okuma, güncelleme ve silme işlemlerini gerçekleştirecektir.
from fastapi import FastAPI, HTTPException, Depends
from typing import List
from models import Todo, TodoCreate
from database import get_db, engine
import models
from sqlalchemy.orm import Session
models.Base.metadata.create_all(bind=engine)
app = FastAPI()
@app.get("/todos", response_model=List[Todo])
async def read_todos(db: Session = Depends(get_db)):
todos = db.query(models.Todos).all()
return todos
@app.post("/todos", response_model=Todo)
async def create_todo(todo: TodoCreate, db: Session = Depends(get_db)):
db_todo = models.Todos(**todo.dict())
db.add(db_todo)
db.commit()
db.refresh(db_todo)
return db_todo
@app.get("/todos/{todo_id}", response_model=Todo)
async def read_todo(todo_id: int, db: Session = Depends(get_db)):
todo = db.query(models.Todos).filter(models.Todos.id == todo_id).first()
if todo is None:
raise HTTPException(status_code=404, detail="Todo not found")
return todo
@app.put("/todos/{todo_id}", response_model=Todo)
async def update_todo(todo_id: int, todo: TodoCreate, db: Session = Depends(get_db)):
db_todo = db.query(models.Todos).filter(models.Todos.id == todo_id).first()
if db_todo is None:
raise HTTPException(status_code=404, detail="Todo not found")
for key, value in todo.dict().items():
setattr(db_todo, key, value)
db.commit()
db.refresh(db_todo)
return db_todo
@app.delete("/todos/{todo_id}", response_model=Todo)
async def delete_todo(todo_id: int, db: Session = Depends(get_db)):
todo = db.query(models.Todos).filter(models.Todos.id == todo_id).first()
if todo is None:
raise HTTPException(status_code=404, detail="Todo not found")
db.delete(todo)
db.commit()
return todo
Bu kod, aşağıdaki API endpoint’lerini tanımlar:
GET /todos
: Tüm Todo List öğelerini listeler.POST /todos
: Yeni bir Todo List öğesi oluşturur.GET /todos/{todo_id}
: Belirli bir Todo List öğesini getirir.PUT /todos/{todo_id}
: Belirli bir Todo List öğesini günceller.DELETE /todos/{todo_id}
: Belirli bir Todo List öğesini siler.
Veri Tabanı Entegrasyonu (SQLAlchemy)
Veri tabanı bağlantısını ve modelini tanımlamak için database.py
dosyasını oluşturalım:
from sqlalchemy import create_engine, Column, Integer, String, Boolean
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
from dotenv import load_dotenv
import os
load_dotenv()
DATABASE_URL = os.getenv("DATABASE_URL")
engine = create_engine(DATABASE_URL)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
Base = declarative_base()
class Todos(Base):
__tablename__ = "todos"
id = Column(Integer, primary_key=True, index=True)
title = Column(String)
description = Column(String, nullable=True)
completed = Column(Boolean, default=False)
def get_db():
db = SessionLocal()
try:
yield db
finally:
db.close()
Bu kod, SQLAlchemy kullanarak bir SQLite veri tabanı bağlantısı oluşturur ve Todo List öğelerini temsil eden bir model tanımlar.
.env
dosyasına aşağıdaki satırı ekleyin (örnek olarak SQLite kullanıyoruz. PostgreSQL, MySQL gibi farklı veri tabanları kullanmak isterseniz bağlantı adresini buna göre değiştirmelisiniz.):
DATABASE_URL=sqlite:///./todo.db
CRUD İşlemleri (Create, Read, Update, Delete)
Yukarıda main.py
dosyasında tanımladığımız API endpoint’leri, Todo List öğeleri üzerinde CRUD işlemlerini gerçekleştirmektedir. Bu işlemler, veri tabanına kaydedilen Todo List öğelerini oluşturma, okuma, güncelleme ve silme işlemlerini kapsar.
API’yi Test Etme
API’yi test etmek için, Uvicorn sunucusunu kullanarak uygulamayı çalıştırın:
uvicorn main:app --reload
Bu komut, uygulamayı yerel sunucuda (genellikle http://127.0.0.1:8000
) başlatır. Ardından, bir API istemci (örneğin, Postman veya cURL) kullanarak API endpoint’lerini test edebilirsiniz.
Otomatik Dokümantasyon (Swagger UI ve ReDoc)
FastAPI, otomatik dokümantasyon özelliği sayesinde, API’nizin Swagger UI ve ReDoc arayüzleri üzerinden otomatik olarak dokümante edilmesini sağlar. Bu arayüzlere aşağıdaki adreslerden erişebilirsiniz:
- Swagger UI:
http://127.0.0.1:8000/docs
- ReDoc:
http://127.0.0.1:8000/redoc
Bu arayüzler, API endpoint’lerinizi, parametrelerini ve yanıtlarını kolayca görüntülemenizi ve test etmenizi sağlar.
Sonuç
Bu makalede, FastAPI kullanarak nasıl hızlı ve etkili bir Todo List API’si geliştirebileceğinizi adım adım inceledik. FastAPI’nin sunduğu avantajlar sayesinde, daha az kod yazarak, daha güvenilir ve yüksek performanslı API’ler oluşturabilirsiniz. Otomatik dokümantasyon özelliği sayesinde, API’nizin dokümantasyonunu kolayca oluşturabilir ve API’yi kullanan geliştiricilerin işini kolaylaştırabilirsiniz. FastAPI, modern web ve mobil uygulama geliştirme süreçlerinde API geliştirme için mükemmel bir seçenektir.