Merhabalar. Bugünkü yazımızda Python’un en popüler web framework’lerinden biri olan FastAPI ile sıfırdan bir REST API oluşturacağız. Hiç FastAPI kullanmadıysanız sorun yok — her şeyi adım adım anlatacağım. Önce ne olduğunu kısaca açıklayalım, sonra kurulumu yapalım, en sonunda da çalışır bir API’miz olacak.
FastAPI Nedir?
FastAPI, Python için geliştirilmiş modern ve hızlı bir web framework’tür. Starlette ve Pydantic üzerine inşa edilmiştir. En büyük avantajları şunlardır:
- Çok hızlı: Node.js ve Go seviyesinde performans verir
- Tip güvenliği: Python type hint’lerini kullanarak otomatik doğrulama yapar
- Otomatik dokümantasyon: Kodu yazdığınızda Swagger UI ve ReDoc dokümantasyonu hazır gelir
- Kolay öğrenim: Flask’a benzer ama çok daha güçlü
2026 itibarıyla FastAPI, GitHub’da Flask’ı geçerek Python’un en çok yıldız alan web framework’ü oldu. Microsoft, Netflix ve Uber gibi şirketler üretim ortamlarında kullanıyor. Güncel sürüm 0.136.x serisi ve Python 3.10+ gerektiriyor.
1. Kurulum
Öncelikle bir sanal ortam oluşturmanızı tavsiye ederim. Eğer venv kullanımı hakkında bilginiz yoksa önceki yazımıza göz atabilirsiniz. Burada hızlıca özet geçelim:
python3 -m venv venv
source venv/bin/activate
Şimdi FastAPI’yi kuralım. [standard] etiketi ile birlikte uvicorn (ASGI sunucusu) da otomatik gelir:
pip install "fastapi[standard]"
Bu komut şu an için yaklaşık şu sürümleri kuracak:
- FastAPI 0.136.x
- Uvicorn 0.34.x
- Pydantic v2.x
Kurulum tamamlandıysa devam edelim.
2. İlk FastAPI Uygulaması
Proje klasörünüzde main.py adında bir dosya oluşturun ve içine şunları yazın:
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def root():
return {"mesaj": "Merhaba Dünya"}
Bu kadar. Şimdi sunucuyu başlatalım. İki yol var:
Yeni yöntem (önerilen):
fastapi dev
Klasik yöntem:
uvicorn main:app --reload
--reload parametresi dosyada değişiklik yaptığınızda sunucuyu otomatik yeniden başlatır, geliştirme için çok kullanışlıdır.
Terminalde şöyle bir çıktı görmelisiniz:
INFO: Will watch for changes in these directories
INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO: Started reloader process
INFO: Application startup complete.
Tarayıcınızı açın ve http://127.0.0.1:8000/ adresine gidin. Şu JSON cevabını göreceksiniz:
{"mesaj": "Merhaba Dünya"}
Tebrikler! İlk FastAPI endpoint’iniz çalışıyor.
3. Otomatik Dokümantasyon
FastAPI’nin en sevdiğim özelliklerinden biri otomatik dokümantasyon. Hiçbir ekstra kod yazmadan şu adreslerde API dokümantasyonunuz hazır olur:
- Swagger UI:
http://127.0.0.1:8000/docs— interaktif, istek gönderebildiğiniz arayüz - ReDoc:
http://127.0.0.1:8000/redoc— daha detaylı, okunaklı dokümantasyon - OpenAPI JSON:
http://127.0.0.1:8000/openapi.json— ham OpenAPI 3.1 şeması
/docs adresine gidip GET / endpoint’ini deneyebilirsiniz. “Try it out” butonuna basıp “Execute” dediğinizde cevabı görebilirsiniz. Bu özellik gerçek bir API test aracı (Postman gibi) görevi görür, hem de ekstra bir şey kurmanıza gerek yoktur.
4. Path ve Query Parametreleri
Şimdi API’mize biraz daha功能 katalım. main.py dosyanızı şu şekilde güncelleyin:
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def root():
return {"mesaj": "Merhaba Dünya"}
@app.get("/ogrenciler/{ogrenci_id}")
async def ogrenci_getir(ogrenci_id: int):
return {"ogrenci_id": ogrenci_id, "ad": "Ahmet", "soyad": "Yılmaz"}
Bu örnekte ogrenci_id bir path parametresidir. Tipini int olarak belirttiğimiz için FastAPI otomatik olarak string’ten integer’a çevirir. Eğer bir kullanıcı /ogrenciler/abc adresine giderse FastAPI şöyle bir hata döner:
{
“detail”: [
{
“type”: “int_parsing”,
“loc”: [“path”, “ogrenci_id”],
“msg”: “Input should be a valid integer”
}
]
}
Şimdi bir de query parametresi ekleyelim:
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def root():
return {"mesaj": "Merhaba Dünya"}
@app.get("/ogrenciler/{ogrenci_id}")
async def ogrenci_getir(ogrenci_id: int):
return {"ogrenci_id": ogrenci_id, "ad": "Ahmet", "soyad": "Yılmaz"}
@app.get("/araclar/")
async def arac_listele(skip: int = 0, limit: int = 10):
return {"skip": skip, "limit": limit}
/araclar/ endpoint’ine gittiğinizde skip ve limit parametreleri için varsayılan değerler kullanılır. Ama http://127.0.0.1:8000/araclar/?skip=5&limit=20 adresine giderseniz:
{"skip": 5, "limit": 20}
FastAPI bu parametreleri otomatik olarak algılar, tiplerini doğrular ve Swagger UI’da gösterir. Hiçbir ekstra iş yapmanıza gerek yoktur.
5. Pydantic ile Veri Modelleri (POST İstekleri)
Şimdi geldik işin eğlenceli kısmına: veri almak. Bir öğrenci ekleme endpoint’i yapalım. Bunun için Pydantic’ten BaseModel kullanacağız:
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class Ogrenci(BaseModel):
ad: str
soyad: str
sinif: int
ortalama: float | None = None
ogrenciler = []
@app.get("/")
async def root():
return {"mesaj": "Merhaba Dünya"}
@app.get("/ogrenciler/")
async def ogrenci_listele():
return {"ogrenciler": ogrenciler}
@app.post("/ogrenciler/")
async def ogrenci_ekle(ogrenci: Ogrenci):
ogrenciler.append(ogrenci)
return {"mesaj": "Öğrenci eklendi", "ogrenci": ogrenci}
Ogrenci modelimiz ad (str), soyad (str), sinif (int) ve ortalama (opsiyonel float) alanlarından oluşuyor. ortalama için None varsayılan değeri verdiğimiz için bu alan isteğe bağlıdır.
http://127.0.0.1:8000/docs adresine gidin. Artık POST /ogrenciler/ endpoint’ini göreceksiniz. “Try it out” deyip şu JSON’ı gönderebilirsiniz:
{
“ad”: “Ayşe”,
“soyad”: “Kaya”,
“sinif”: 9,
“ortalama”: 85.5
}
Cevap olarak şunu alırsınız:
{
“mesaj”: “Öğrenci eklendi”,
“ogrenci”: {
“ad”: “Ayşe”,
“soyad”: “Kaya”,
“sinif”: 9,
“ortalama”: 85.5
}
}
Eğer int beklenen sinif alanına string gönderirseniz, FastAPI otomatik olarak hata döner:
{
“detail”: [
{
“type”: “int_type”,
“loc”: [“body”, “sinif”],
“msg”: “Input should be a valid integer”
}
]
}
Bu doğrulama tamamen otomatiktir. Pydantic v2 tarafından Rust tabanlı bir motorla yapılır, yani çok da hızlıdır.
6. Uygulamayı Durdurma
Sunucuyu durdurmak için terminalde CTRL+C tuşlarına basın. Sanal ortamdan çıkmak için:
deactivate
Yaygın Hatalar ve Çözümleri
Hata: “ModuleNotFoundError: No module named ‘fastapi'”
Sanal ortamı aktifleştirmemiş olabilirsiniz. Terminalinizde (venv) işaretini görmüyorsanız:
source venv/bin/activate
Hata: “Port 8000 is already in use”
8000 portu başka bir uygulama tarafından kullanılıyor. Farklı bir port ile başlatabilirsiniz:
uvicorn main:app --reload --port 8080
Hata: “fastapi: command not found”
fastapi dev komutu için fastapi[standard] paketini kurmuş olmanız gerekir. Sadece pip install fastapi kurduysanız fastapi CLI gelmez. Düzeltmek için:
pip install "fastapi[standard]"
Sonuç
Bu yazıda FastAPI ile sıfırdan bir REST API oluşturduk. Path parametreleri, query parametreleri ve Pydantic ile veri modellerini gördük. FastAPI’nin otomatik dokümantasyonu sayesinde API’nizi test etmek için ekstra bir araca bile ihtiyacınız yok. Bir sonraki yazımızda veritabanı entegrasyonu ve authentication konularına değineceğiz. Okuduğunuz için teşekkür ederim!