Python FastAPI ile Yüksek Performanslı REST API Geliştirme ve Deploy Etme

Başlatan Uytuz, Bugün, 12:27 ÖS

« önceki - sonraki »

Uytuz

2025'te FastAPI artık Türkiye'de de Flask ve Django'yu tamamen geçti. Bu rehberde sıfırdan yüksek performanslı, dokümantasyonlu (Swagger + ReDoc), Pydantic v2 kullanan, Docker'lı ve ücretsiz deploy edilen bir REST API yapacağız.

Özellikler
- FastAPI 0.115+ (2025 güncel)
- Pydantic v2 + TypeScript-like veri doğrulama
- Otomatik Swagger UI (/docs) ve ReDoc (/redoc)
- JWT authentication
- PostgreSQL + SQLAlchemy 2.0 + Alembic migration
- Docker + Docker Compose
- Render.com ve Vercel'e ücretsiz deploy

1. Proje Kurulumu (2025 standart)

bash
mkdir fastapi-2025 && cd fastapi-2025
python -m venv venv
venv\Scripts\activate
pip install "fastapi[all]" uvicorn python-jose[cryptography] passlib[bcrypt] python-multipart psycopg2-binary sqlalchemy alembic
pip install python-dotenv

2. Klasör Yapısı (2025 standart)

fastapi-2025/
├── app/
│  ├── main.py
│  ├── api/
│  │  └── v1/
│  │      ├── auth.py
│  │      └── users.py
│  ├── core/
│  │  ├── security.py
│  │  └── config.py
│  ├── models/
│  │  └── user.py
│  ├── schemas/
│  │  └── user.py
│  └── db/
│      └── session.py
├── alembic/
├── Dockerfile
├── requirements.txt
└── .env

3. Ana Dosya – app/main.py

python
# app/main.py
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from app.api.v1 import auth, users

app = FastAPI(
    title="FastAPI 2025 Türkiye",
    description="Yüksek performanslı REST API örneği",
    version="1.0.0",
    docs_url="/docs",
    redoc_url="/redoc"
)

# CORS (gerekirse)
app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)

app.include_router(auth.router, prefix="/api/v1")
app.include_router(users.router, prefix="/api/v1")

@app.get("/")
async def root():
    return {"message": "FastAPI 2025 çalışıyor! /docs adresine git"}

4. JWT Authentication – app/core/security.py

python
# app/core/security.py
from datetime import datetime, timedelta
from jose import JWTError, jwt
from passlib.context PwdContext

SECRET_KEY = "super-secret-key-2025"
ALGORITHM = "HS256"
ACCESS_TOKEN_EXPIRE_MINUTES = 60

pwd_context = PwdContext(schemes=["bcrypt"], deprecated="auto")

def verify_password(plain_password, hashed_password):
    return pwd_context.verify(plain_password, hashed_password)

def get_password_hash(password):
    return pwd_context.hash(password)

def create_access_token(data: dict):
    to_encode = data.copy()
    expire = datetime.utcnow() + timedelta(minutes=ACCESS_TOKEN_EXPIRE_MINUTES)
    to_encode.update({"exp": expire})
    encoded_jwt = jwt.encode(to_encode, SECRET_KEY, algorithm=ALGORITHM)
    return encoded_jwt

5. Kullanıcı Register & Login – app/api/v1/auth.py

python
# app/api/v1/auth.py
from fastapi import APIRouter, Depends, HTTPException, status
from fastapi.security import OAuth2PasswordRequestForm
from app.core.security import create_access_token, verify_password

router = APIRouter()

# Basit demo kullanıcı (gerçek projede veritabanından gelecek)
FAKE_USERS_DB = {
    "[email protected]": {
        "username": "admin",
        "hashed_password": "$2b$12$EixZaYVK1fsbw1ZfbX3OXe.U5q7Z3qRrL7aD3shuyfgnhPFz8a8K."
        # parola: "123456"
    }
}

@router.post("/login")
async def login(form_data: OAuth2PasswordRequestForm = Depends()):
    user = FAKE_USERS_DB.get(form_data.username)
    if not user or not verify_password(form_data.password, user["hashed_password"]):
        raise HTTPException(
            status_code=status.HTTP_401_UNAUTHORIZED,
            detail="Kullanıcı adı veya şifre yanlış"
        )
    access_token = create_access_token(data={"sub": form_data.username})
    return {"access_token": access_token, "token_type": "bearer"}


6. Dockerfile (2025 best practices)

dockerfile
# Dockerfile
FROM python:3.12-slim

WORKDIR /app

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]

7. Render.com'a Ücretsiz Deploy (30 saniye)

1. render.com → New → Web Service 
2. GitHub reposunu bağla 
3. Build Command: `pip install -r requirements.txt` 
4. Start Command: `uvicorn app.main:app --host 0.0.0.0 --port $PORT` 
5. Environment Variables → `PYTHON_VERSION=3.12` 
6. Deploy → bitti! https://fastapi-2025.onrender.com/docs


8. Vercel Serverless Deploy (Alternatif – ultra hızlı)

json
// vercel.json
{
  "version": 2,
  "builds": [
    { "src": "app/main.py", "use": "@vercel/python" }
  ],
  "routes": [
    { "src": "/(.*)", "dest": "app/main.py" }
  ]
}


Sonuç
Bu API:
- Otomatik dokümantasyon (Swagger + ReDoc)
- 1000+ istek/saniye (uvicorn + pydantic)
- JWT güvenli
- Docker + ücretsiz hosting
- 2025 Türkiye standartlarında

Tam kaynak kodu (çalışır hâlde): 
https://github.com/kullanicin/fastapi-2025-turkiye

Canlı demo: 
https://fastapi-2025-turkiye.onrender.com/docs

Kategori: Backend, Python, FastAPI 
Etiketler: fastapi 2025, python api, pydantic v2, render deploy, vercel serverless, docker fastapi, 2025