Flutter + Django Projesi: Güvenli API, JWT Login ve Redis Performans Sistemi
🚀 Django Middleware Nedir?
📌 1. Middleware Nedir?
Django’da Middleware, gelen HTTP istekleri (request) ile giden cevaplar (response) arasında çalışan ara katmandır.
📊 Basit mantık:
Kullanıcı → Middleware → View → Middleware → Kullanıcı
Yani:
İstek gelmeden önce işlem yapabilir
Response gitmeden önce işlem yapabilir
🎯 Middleware Ne İşe Yarar?
Gerçek projelerde middleware şunlar için kullanılır:
🔐 Kimlik kontrolü (authentication)
📊 Loglama (kim ne zaman girdi)
🚫 IP engelleme
🌍 Dil / lokasyon yönetimi
⚡ Performans ölçme
🛡️ Güvenlik kontrolleri
⚙️ Django’da Middleware Nerede?
settings.py dosyasında:
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
]
Middleware Nasıl Çalışır?
Middleware bir sınıftır ve genelde şu yapıya sahiptir:
class MyMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
# request gelince çalışır
response = self.get_response(request)
# response giderken çalışır
return response
🔥 1. İlk Middleware Örneği (Loglama)
🎯 Amaç:
Kullanıcı siteye girince terminale yazdıralım
# core/middleware.py
class LogMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
print(f"Gelen istek: {request.path}")
response = self.get_response(request)
print(f"Giden response: {response.status_code}")
return response
⚙️ Middleware’i Aktif Etme
settings.py içine ekle:
MIDDLEWARE = [
...
'core.middleware.LogMiddleware',
]
🔐 2. PRO Örnek: Basit Yetki Kontrolü
🎯 Amaç:
Login olmayan kullanıcıyı engelle
from django.http import HttpResponse
class AuthMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
if not request.user.is_authenticated:
return HttpResponse("Giriş yapmalısın!")
return self.get_response(request)
🚫 3. IP Engelleme Middleware
class BlockIPMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
blocked_ips = ['127.0.0.1']
ip = request.META.get('REMOTE_ADDR')
if ip in blocked_ips:
return HttpResponse("Erişim engellendi")
return self.get_response(request)
⚡ 4. Performans Ölçen Middleware
import time
class PerformanceMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
start = time.time()
response = self.get_response(request)
end = time.time()
print(f"Süre: {end - start} saniye")
return response
Gelişmiş Middleware Hook’ları
Django’da daha detaylı kontrol için:
class AdvancedMiddleware:
def process_view(self, request, view_func, view_args, view_kwargs):
print("View çalışmadan önce")
def process_exception(self, request, exception):
print("Hata oluştu!")
def process_template_response(self, request, response):
print("Template response")
return response
🏗️ Gerçek Proje Senaryosu
🎓 Okul Yönetim Sistemi:
Middleware ile:
Öğrenci → sadece öğrenci sayfalarına erişsin
Öğretmen → not girebilsin
Admin → her şeye erişsin
💡 PRO İpuçları
Middleware sırası çok önemli ⚠️
Üstte olan önce çalışır
Altta olan en son çalışır
🚀 Middleware Akış Diyagramı
Request →
Middleware 1 →
Middleware 2 →
View →
Middleware 2 →
Middleware 1 →
Response
🎁 BONUS: Middleware + JWT
Senin projene uygun 🔥
Django + Flutter projesinde:
Middleware ile:
Token kontrolü
Kullanıcı doğrulama
API güvenliği
🧪 Mini Ödev
Şunu yapmayı dene:
👉 Kullanıcı her sayfaya girdiğinde:
IP adresi
Tarih
URL
kaydedilsin (log sistemi)
🏁 Sonuç
Middleware:
Django’nun en güçlü sistemlerinden biridir
Backend kontrolünün kalbidir
Büyük projelerde mutlaka kullanılır
🚀 1. Django Middleware + JWT Authentication Sistemi
🎯 Amaç
Flutter / Web client → Django API
🔐 Her istekte JWT kontrolü
📦 Gerekli Paketler
pip install djangorestframework
pip install PyJWT
⚙️ JWT Middleware Yazalım
# core/middleware/jwt_middleware.py
import jwt
from django.conf import settings
from django.http import JsonResponse
from django.contrib.auth.models import User
class JWTAuthenticationMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
token = request.headers.get('Authorization')
if token:
try:
token = token.split(" ")[1] # Bearer TOKEN
payload = jwt.decode(token, settings.SECRET_KEY, algorithms=["HS256"])
user = User.objects.get(id=payload['user_id'])
request.user = user
except Exception as e:
return JsonResponse({"error": "Geçersiz token"}, status=401)
return self.get_response(request)
⚙️ settings.py
MIDDLEWARE += [
'core.middleware.jwt_middleware.JWTAuthenticationMiddleware'
]
🔥 JWT Login View
import jwt
from django.conf import settings
from django.contrib.auth import authenticate
from django.http import JsonResponse
def login_view(request):
username = request.POST.get("username")
password = request.POST.get("password")
user = authenticate(username=username, password=password)
if user:
token = jwt.encode(
{"user_id": user.id},
settings.SECRET_KEY,
algorithm="HS256"
)
return JsonResponse({"token": token})
return JsonResponse({"error": "Hatalı giriş"})
🚫 2. Middleware ile Rate Limit (API Koruma)
🎯 Amaç
Bir kullanıcı:
1 dakikada max 10 istek atsın
🧠 Mantık
IP → request sayısı → süre kontrolü
⚙️ Rate Limit Middleware
# core/middleware/rate_limit.py
import time
from django.http import JsonResponse
REQUEST_LIMIT = 10
TIME_WINDOW = 60 # saniye
ip_cache = {}
class RateLimitMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
ip = request.META.get('REMOTE_ADDR')
current_time = time.time()
if ip not in ip_cache:
ip_cache[ip] = []
# eski istekleri temizle
ip_cache[ip] = [
t for t in ip_cache[ip] if current_time - t < TIME_WINDOW
]
if len(ip_cache[ip]) >= REQUEST_LIMIT:
return JsonResponse({"error": "Çok fazla istek"}, status=429)
ip_cache[ip].append(current_time)
return self.get_response(request)
⚡ 3. Redis + Middleware (PRO SEVİYE)
🎯 Neden Redis?
Normal Python dict ❌
Redis ✅ (çok hızlı, kalıcı, scalable)
📦 Kurulum
pip install redis
⚙️ Redis Bağlantısı
import redis
redis_client = redis.Redis(host='localhost', port=6379, db=0)
🚀 Redis Rate Limit Middleware
class RedisRateLimitMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
ip = request.META.get('REMOTE_ADDR')
key = f"rate_limit:{ip}"
count = redis_client.get(key)
if count and int(count) > 10:
return JsonResponse({"error": "Limit aşıldı"}, status=429)
redis_client.incr(key)
redis_client.expire(key, 60)
return self.get_response(request)
🏗️ 4. GERÇEK PROJE MİMARİSİ
📁 Klasör Yapısı
project/
│
├── core/
│ ├── middleware/
│ │ ├── jwt_middleware.py
│ │ ├── rate_limit.py
│ │ └── redis_rate_limit.py
│
├── users/
│ ├── views.py
│ ├── models.py
│
├── api/
│ ├── views.py
│
├── manage.py
🔥 API Koruma
def protected_view(request):
if not request.user.is_authenticated:
return JsonResponse({"error": "Yetkisiz"}, status=401)
return JsonResponse({"message": "Başarılı"})
Gerçek Sistem Nasıl Çalışır?
📱 Flutter App
↓
🔐 JWT Token gönderir
↓
⚡ Middleware:
Token kontrol
Rate limit
IP kontrol
↓
🎯 View çalışır
💣 PRO İpuçları (ÇOK ÖNEMLİ)
1. Middleware sırası
MIDDLEWARE = [
'rate_limit',
'jwt_middleware',
]
✔ önce rate limit
✔ sonra auth
2. Production’da ne kullanılır?
❌ Elle JWT yazılmaz
✅
djangorestframework-simplejwt
3. Redis + Nginx + Gunicorn = 🚀
Büyük sistemlerde:
Redis → cache
Middleware → kontrol
Nginx → load balance
🚀 FULL PROJE: Django + JWT + Redis + Rate Limit + Flutter
Bu proje gerçek bir production mimarisine yakın şekilde hazırlanmıştır.
📁 BACKEND (Django)
1. Kurulum
pip install django djangorestframework redis PyJWT
2. Proje Oluştur
django-admin startproject config
cd config
python manage.py startapp core
python manage.py startapp users
3. settings.py
INSTALLED_APPS = [
'rest_framework',
'core',
'users',
]
MIDDLEWARE += [
'core.middleware.rate_limit.RateLimitMiddleware',
'core.middleware.jwt_middleware.JWTAuthenticationMiddleware',
]
4. JWT Middleware
import jwt
from django.conf import settings
from django.http import JsonResponse
from django.contrib.auth.models import User
class JWTAuthenticationMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
token = request.headers.get('Authorization')
if token:
try:
token = token.split()[1]
payload = jwt.decode(token, settings.SECRET_KEY, algorithms=['HS256'])
request.user = User.objects.get(id=payload['user_id'])
except:
return JsonResponse({'error': 'Invalid token'}, status=401)
return self.get_response(request)
5. Redis Rate Limit
import redis
from django.http import JsonResponse
redis_client = redis.Redis(host='localhost', port=6379, db=0)
class RateLimitMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
ip = request.META.get('REMOTE_ADDR')
key = f"rate:{ip}"
count = redis_client.get(key)
if count and int(count) > 10:
return JsonResponse({'error': 'Too many requests'}, status=429)
redis_client.incr(key)
redis_client.expire(key, 60)
return self.get_response(request)
6. Login API
import jwt
from django.conf import settings
from django.contrib.auth import authenticate
from django.http import JsonResponse
def login_view(request):
username = request.POST.get('username')
password = request.POST.get('password')
user = authenticate(username=username, password=password)
if user:
token = jwt.encode({'user_id': user.id}, settings.SECRET_KEY, algorithm='HS256')
return JsonResponse({'token': token})
return JsonResponse({'error': 'Login failed'})
7. Protected API
from django.http import JsonResponse
def dashboard(request):
if not request.user.is_authenticated:
return JsonResponse({'error': 'Unauthorized'}, status=401)
return JsonResponse({'message': 'Welcome'})
📱 FLUTTER FRONTEND
pubspec.yaml
dependencies:
http: ^0.13.6
Login Service
import 'dart:convert';
import 'package:http/http.dart' as http;
Future<String?> login(String username, String password) async {
var response = await http.post(
Uri.parse('http://127.0.0.1:8000/login'),
body: {
'username': username,
'password': password
}
);
var data = jsonDecode(response.body);
return data['token'];
}
Token ile API çağrısı
Future<void> getDashboard(String token) async {
await http.get(
Uri.parse('http://127.0.0.1:8000/dashboard'),
headers: {
'Authorization': 'Bearer $token'
}
);
}
🎨 Figma UI TASARIM (Ekranlar)
1. Login Screen
Username input
Password input
Login button
2. Dashboard
Welcome text
User info
Logout button
🚀 PRO GELİŞTİRME
Refresh Token
Logout blacklist
Admin panel logging
Device tracking
🏁 SON
Bu proje:
JWT Auth
Redis Rate Limit
Flutter client
Tam bir production başlangıcıdır.
🏁 SONUÇ
Bu sistemle:
🔐 Güvenli API
⚡ Hızlı response
🚫 DDOS koruması
📱 Flutter uyumlu backend
🚀 SONRAKİ ADIM (ÖNERİM)
İstersen projeyi şu seviyeye çıkarabilirim:
🔥 BACKEND (PRO)
✅ Refresh Token sistemi
✅ Logout (token blacklist)
✅ Django Admin dashboard (grafikler + loglar)
✅ API request logging (kim ne yaptı)
✅ Role-based auth (admin / user)
📱 FLUTTER (PRO)
✅ Modern UI (Material 3)
✅ Token saklama (secure storage)
✅ Auto login (remember me)
✅ Error handling (toast/snackbar)
✅ API service layer (clean architecture)
🎨 FIGMA (GERÇEK APP)
✅ Login ekranı (modern)
✅ Dashboard UI
✅ Dark mode
✅ Mobil UX kuralları
🚀 PROJE: Django + JWT + Redis + Flutter (PRO LEVEL)
🏗️ 1. PROJE MİMARİSİ (GERÇEK)
fullstack-project/
│
├── backend/
│ ├── config/
│ ├── core/
│ │ ├── middleware/
│ │ ├── services/
│ │ ├── utils/
│ │
│ ├── users/
│ ├── auth_app/
│ ├── api/
│ │
│ ├── requirements.txt
│ ├── .env
│ ├── Dockerfile
│
├── frontend/
│ ├── lib/
│ │ ├── core/
│ │ ├── services/
│ │ ├── screens/
│ │ ├── widgets/
│ │
│ ├── pubspec.yaml
│
├── docker-compose.yml
└── README.md
🔐 2. BACKEND (DJANGO PRO)
📦 requirements.txt
Django
djangorestframework
djangorestframework-simplejwt
redis
python-dotenv
psycopg2-binary
⚙️ settings.py (ÖNEMLİ)
from datetime import timedelta
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework_simplejwt.authentication.JWTAuthentication',
),
}
SIMPLE_JWT = {
'ACCESS_TOKEN_LIFETIME': timedelta(minutes=30),
'REFRESH_TOKEN_LIFETIME': timedelta(days=1),
}
🔥 3. JWT AUTH (PRO)
login / refresh
from rest_framework_simplejwt.views import (
TokenObtainPairView,
TokenRefreshView,
)
urlpatterns = [
path('login/', TokenObtainPairView.as_view()),
path('refresh/', TokenRefreshView.as_view()),
]
🚫 4. REDIS RATE LIMIT (PRO)
import redis
from django.http import JsonResponse
redis_client = redis.Redis(host='redis', port=6379)
class RateLimitMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
ip = request.META.get('REMOTE_ADDR')
key = f"rate:{ip}"
count = redis_client.get(key)
if count and int(count) > 20:
return JsonResponse({"error": "Too many requests"}, status=429)
redis_client.incr(key)
redis_client.expire(key, 60)
return self.get_response(request)
📊 5. LOGGING SYSTEM (GERÇEK PROJE)
class APILogMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
print(f"{request.method} {request.path} - {request.user}")
return self.get_response(request)
6. ROLE BASED AUTH
def is_admin(user):
return user.is_staff
def is_user(user):
return not user.is_staff
🐳 7. DOCKER (ÇOK ÖNEMLİ)
docker-compose.yml
version: '3'
services:
web:
build: ./backend
ports:
- "8000:8000"
depends_on:
- redis
- db
redis:
image: redis:latest
db:
image: postgres:13
environment:
POSTGRES_DB: mydb
POSTGRES_USER: user
POSTGRES_PASSWORD: pass
📱 8. FLUTTER (PRO)
pubspec.yaml
dependencies:
http: ^0.13.6
flutter_secure_storage: ^9.0.0
🔐 TOKEN STORAGE
final storage = FlutterSecureStorage();
await storage.write(key: "token", value: token);
🔥 API SERVICE
class ApiService {
final String baseUrl = "http://10.0.2.2:8000";
Future<String?> login(String username, String password) async {
final response = await http.post(
Uri.parse("$baseUrl/login/"),
body: {
"username": username,
"password": password,
},
);
return jsonDecode(response.body)["access"];
}
}
📲 DASHBOARD CALL
Future<void> getData(String token) async {
await http.get(
Uri.parse("http://10.0.2.2:8000/api/data"),
headers: {
"Authorization": "Bearer $token"
},
);
}
🎨 9. UI (FIGMA MANTIĞI)
Login Screen
Email
Password
Login Button
Remember me
Dashboard
API data list
User info
Logout
💣 10. PRO FEATURES (ŞİRKET SEVİYESİ)
Bunları eklersen proje uçar 🚀
✅ Refresh token rotation
✅ Token blacklist (logout)
✅ Device tracking
✅ Admin analytics panel
✅ API rate limit per user
✅ Swagger docs (drf-yasg)
🏁 SONUÇ
Bu proje:
🔐 JWT güvenli
⚡ Redis hızlı
📱 Flutter uyumlu
🐳 Docker deploy edilebilir
💼 GitHub portföy projesi
Yorumlar
Yorum Gönder