Django REST Framework (DRF) Mimarisi

Günümüz web geliştirmesinde, ön uç (frontend) ve arka uç (backend) sistemlerinin birbirinden bağımsız çalışması standart bir pratik haline gelmiştir. Bu ayrımı sağlayan en temel yapı taşlarından biri RESTful API'lardır. Python dünyasında, Django web çerçevesi üzerine inşa edilen Django REST Framework (DRF), güçlü, esnek ve ölçeklenebilir API'lar oluşturmak için fiili standarttır.



1. DRF Mimarisinin Temel Bileşenleri

Django'nun klasik MVT (Model-View-Template) mimarisine aşinaysanız, DRF'nin bu yapıyı nasıl API dostu bir hale getirdiğini anlamak kolaylaşır. DRF'de "Template" (şablon) katmanının yerini Serializer'lar ve JSON yanıtları alır.

Mimari, genel olarak dört ana bileşenden oluşur:

1.1. Modeller (Models)

DRF, veri tabanı işlemleri için doğrudan Django'nun kendi ORM (Object-Relational Mapping) yapısını kullanır. Model, veritabanınızdaki bir tablonun Python sınıfı olarak temsil edilmesidir. Verinin yapısını ve veritabanı ilişkilerini tanımlar.

1.2. Serializer'lar (Serileştiriciler)

DRF mimarisinin kalbi Serializer'lardır. Temel olarak iki hayati işlevi vardır:

  • Serileştirme (Serialization): Karmaşık veri tiplerini (örneğin Django Model nesnelerini veya QuerySet'leri), JSON veya XML gibi ön uç uygulamalarının kolayca okuyabileceği formatlara dönüştürür.

  • Tersine Serileştirme (Deserialization): İstemciden (client) gelen JSON verisini ayrıştırır, doğrular (validation) ve tekrar veritabanına kaydedilebilecek Django nesnelerine dönüştürür.

Not: ModelSerializer sınıfı, doğrudan bir Django modeline bağlı kalarak alanları ve doğrulama kurallarını otomatik olarak oluşturur ve geliştirme sürecini büyük ölçüde hızlandırır.

1.3. View'lar ve ViewSet'ler (Görünümler)

İstemciden gelen HTTP isteklerini (GET, POST, PUT, DELETE) karşılayan ve uygun yanıtı döndüren iş mantığı (business logic) katmanıdır. DRF, farklı karmaşıklık seviyelerine uygun çeşitli View yapıları sunar:

  • Function-Based Views (İşlev Tabanlı - @api_view): En temel seviyedir. Manuel kontrol gerektiren basit endpoint'ler için kullanılır.

  • Class-Based Views (Sınıf Tabanlı - APIView): Kodun yeniden kullanılabilirliğini artırır. GET, POST metodları sınıflar içinde fonksiyonlar olarak tanımlanır.

  • Generic Views: Yaygın API kalıplarını (listeleme, oluşturma, güncelleme) hazır sunar (örneğin ListCreateAPIView).

  • ViewSets: Birden fazla ilgili görünümü tek bir sınıfta birleştirir (List, Retrieve, Create, Update, Destroy). Router'lar ile birlikte kullanıldığında mükemmel bir uyum sağlar.

1.4. Router'lar ve URL'ler

ViewSet kullandığınızda, her bir HTTP metodu için URL rotalarını tek tek yazmanıza gerek kalmaz. DRF Router'ları, ViewSet'leri analiz eder ve gerekli tüm URL yapılandırmalarını otomatik olarak oluşturur.


2. İstek ve Yanıt Döngüsü (Request & Response Cycle)

Bir istemci (örneğin bir React uygulaması veya mobil uygulama) API'nize bir istek gönderdiğinde, arka planda sırasıyla şu adımlar gerçekleşir:

  1. İstek (Request) Gelir: İstemci, belirli bir URL'ye HTTP isteği (örn. GET /api/users/) gönderir.

  2. URL Yönlendirmesi (Routing): Django'nun urls.py dosyası (veya DRF Router'ı) bu isteği yakalar ve ilgili View veya ViewSet'e yönlendirir.

  3. Kimlik Doğrulama ve İzinler (Auth & Permissions): View çalışmadan önce, DRF isteği yapan kullanıcının kimliğini doğrular (Token, JWT, Session) ve bu işlemi yapmaya yetkisi olup olmadığını (Permissions) kontrol eder.

  4. Veritabanı Sorgusu (Model/ORM): View, veritabanından gerekli verileri çekmek için Django ORM'yi kullanarak Model ile iletişime geçer.

  5. Serileştirme (Serializer): Çekilen veriler (nesneler) Serializer'a iletilir. Serializer bu verileri Python sözlüklerine ve ardından JSON formatına çevirir. (Not: Eğer bu bir POST isteğiyse süreç tersine işler; gelen JSON verisi doğrulanır ve modele yazılır).

  6. Yanıt (Response): Oluşturulan JSON verisi, DRF'nin Response nesnesi içine sarılarak, uygun HTTP durum koduyla (örn. 200 OK veya 201 Created) istemciye geri gönderilir.


3. Basit Bir Mimari Örneği

Konseptleri somutlaştırmak için örnek bir "Kitap (Book)" API'si mimarisini kod düzeyinde inceleyelim:

1. Model (models.py) - Veritabanı Yapısı:

Python:
from django.db import models

class Book(models.Model):
    title = models.CharField(max_length=200)
    author = models.CharField(max_length=100)
    published_date = models.DateField()

2. Serializer (serializers.py) - Veri Dönüşümü:

Python:
from rest_framework import serializers
from .models import Book

class BookSerializer(serializers.ModelSerializer):
    class Meta:
        model = Book
        fields = '__all__' # Tüm alanları JSON'a çevir

3. ViewSet (views.py) - İş Mantığı ve İstek Yönetimi:

Python:
from rest_framework import viewsets
from .models import Book
from .serializers import BookSerializer

class BookViewSet(viewsets.ModelViewSet):
    queryset = Book.objects.all() # Veritabanı sorgusu
    serializer_class = BookSerializer # Kullanılacak dönüştürücü

4. Router (urls.py) - URL Yönlendirmesi:

Python:

from django.urls import path, include
from rest_framework.routers import DefaultRouter
from .views import BookViewSet

router = DefaultRouter()
router.register(r'books', BookViewSet) # /books/ URL'sini ViewSet'e bağla

urlpatterns = [
    path('api/', include(router.urls)),
]

Bu sadece birkaç satır kodla; kitapları listeleme, yeni kitap ekleme, belirli bir kitabı getirme, güncelleme ve silme (CRUD) işlemlerinin tamamını barındıran, tam teşekküllü bir REST API ayağa kaldırmış olursunuz.


4. Ek Mimari Katmanları: Güvenlik ve Performans

Gerçek dünya uygulamalarında mimari sadece bu 4 temelden oluşmaz. DRF, sistemi güçlendirmek için ek katmanlar sunar:

  • Authentication (Kimlik Doğrulama): Sisteme kimin girdiğini belirler. Modern API'larda genellikle JWT (JSON Web Tokens) kullanılır (örn. djangorestframework-simplejwt paketi ile).

  • Permissions (İzinler): Doğrulanan kullanıcının ne yapabileceğini belirler. (Örn: Sadece yöneticiler silebilir, herkes okuyabilir - IsAdminUser, IsAuthenticatedOrReadOnly).

  • Pagination (Sayfalama): Büyük veri setlerini (örneğin 10.000 kayıt) tek seferde göndermek yerine sayfalara (örn. 50'şerli) bölerek performansı artırır.

  • Throttling (Hız Sınırlandırma): Kötü niyetli kullanımı engellemek için bir kullanıcının veya IP'nin API'ye yapabileceği saniyelik/günlük istek sayısını kısıtlar.

  • Filtering & Searching (Filtreleme ve Arama): django-filter gibi paketlerle entegre olarak, istemcinin URL üzerinden parametreler göndererek (örn. /api/books/?author=Tolstoy) arama yapmasını sağlar.

Özet

Django REST Framework mimarisi, "Don't Repeat Yourself" (DRY - Kendini Tekrar Etme) prensibine sıkı sıkıya bağlıdır. Modeller veriyi tutar, Serializer'lar veriyi dönüştürür ve doğrular, View'lar/ViewSet'ler mantığı çalıştırır ve Router'lar trafiği yönlendirir. Bu modüler yapı sayesinde; güvenli, bakımı kolay ve farklı platformlara (Web, iOS, Android) aynı anda hizmet verebilen profesyonel arka uç sistemleri geliştirebilirsiniz. 


🚀 Django REST API Mimarisi

📌 1. API Nedir?

API (Application Programming Interface):

➡️ Backend ile frontend’in konuşmasını sağlar
➡️ Mobil uygulamalar, web siteleri ve diğer sistemler veri alıp gönderir

Örnek:

  • Flutter → Django API → JSON veri alır


📌 2. Django vs Django REST Framework

  • Django → Web sitesi yapar (HTML)

  • Django REST Framework (DRF) → API yapar (JSON)

👉 DRF = Django’nun API süper gücü 💪


📌 3. Proje Kurulumu

pip install django djangorestframework
django-admin startproject api_project
cd api_project
python manage.py startapp blog

settings.py:

INSTALLED_APPS = [
    'rest_framework',
    'blog',
]

📌 4. Mimarinin Temel Katmanları

Gerçek projelerde API şu katmanlardan oluşur:

Client (Flutter / React)
        ↓
View (API endpoint)
        ↓
Serializer (veri dönüşümü)
        ↓
Service Layer (iş mantığı)
        ↓
Model (database)

📌 5. Model (Veritabanı Katmanı)

# blog/models.py
from django.db import models

class Post(models.Model):
    title = models.CharField(max_length=200)
    content = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)
python manage.py makemigrations
python manage.py migrate

📌 6. Serializer (JSON Dönüştürücü)

# blog/serializers.py
from rest_framework import serializers
from .models import Post

class PostSerializer(serializers.ModelSerializer):
    class Meta:
        model = Post
        fields = '__all__'

👉 Görevi:

  • Model → JSON

  • JSON → Model


📌 7. View (API Endpoint)

Basit API:

# blog/views.py
from rest_framework.views import APIView
from rest_framework.response import Response
from .models import Post
from .serializers import PostSerializer

class PostListAPIView(APIView):

    def get(self, request):
        posts = Post.objects.all()
        serializer = PostSerializer(posts, many=True)
        return Response(serializer.data)

    def post(self, request):
        serializer = PostSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)

📌 8. URL Tanımlama

# blog/urls.py
from django.urls import path
from .views import PostListAPIView

urlpatterns = [
    path('posts/', PostListAPIView.as_view()),
]
# api_project/urls.py
from django.urls import path, include

urlpatterns = [
    path('api/', include('blog.urls')),
]

📌 9. Daha Profesyonel: ViewSet & Router

from rest_framework.viewsets import ModelViewSet

class PostViewSet(ModelViewSet):
    queryset = Post.objects.all()
    serializer_class = PostSerializer
from rest_framework.routers import DefaultRouter

router = DefaultRouter()
router.register('posts', PostViewSet)

urlpatterns = router.urls

👉 Avantaj:

  • Otomatik CRUD

  • Daha az kod

  • Temiz yapı


📌 10. Service Layer (PRO Seviye Mimari)

Burası seni diğerlerinden ayırır 🔥

# blog/services/post_service.py
from .models import Post

def create_post(data):
    return Post.objects.create(**data)

def get_all_posts():
    return Post.objects.all()

View içinde:

from .services.post_service import get_all_posts

def get(self, request):
    posts = get_all_posts()

👉 Neden önemli?

  • Kod tekrarını azaltır

  • Büyük projelerde yönetilebilirlik sağlar


📌 11. Authentication (JWT)

pip install djangorestframework-simplejwt
REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework_simplejwt.authentication.JWTAuthentication',
    ),
}

Login:

from rest_framework_simplejwt.views import TokenObtainPairView

👉 Kullanım:

  • Mobil uygulamalar

  • Güvenli API


📌 12. Permissions (Yetkilendirme)

from rest_framework.permissions import IsAuthenticated

class PostViewSet(ModelViewSet):
    permission_classes = [IsAuthenticated]

📌 13. Pagination (Sayfalama)

REST_FRAMEWORK = {
    'PAGE_SIZE': 10
}

📌 14. Filtreleme & Arama

from rest_framework.filters import SearchFilter

class PostViewSet(ModelViewSet):
    filter_backends = [SearchFilter]
    search_fields = ['title']

📌 15. Gerçek Proje Mimarisi (Şirket Seviyesi)

blog/
│
├── models/
├── serializers/
├── views/
├── services/
├── repositories/
├── urls/
├── tests/

📌 16. Clean Architecture (İleri Seviye)

Katmanlar:

  • Controller (View)

  • Service

  • Repository

  • Model

👉 Avantaj:

  • Test edilebilirlik

  • Büyük projelerde stabilite


📌 17. API Test Etme

  • Postman

  • Thunder Client (VS Code)


📌 18. En İyi Pratikler

✅ Serializer içinde business logic yazma
✅ View’leri sade tut
✅ Service layer kullan
✅ JWT kullan
✅ API versiyonlama yap


🎯 SONUÇ

Bu makale ile öğrendin:

✔ Django REST API mantığı
✔ Katmanlı mimari
✔ Profesyonel yapı
✔ JWT güvenliği
✔ Gerçek proje yaklaşımı



Yorumlar

Bu blogdaki popüler yayınlar

Pardus Üzerine Django Kurulumu

Python ile Web Geliştirme: Django App Oluşturma