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

Bu blogdaki popüler yayınlar

Dart Uygulama Sınavı: Pardus ETAP 23 Kurulum Otomasyonu

Dart Programlama Dil Uygulama Sınavı Çalışma Soruları

Pardus Üzerinde Flutter Geliştirme Ortamı Kurulumu