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:
ModelSerializersı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:
İstek (Request) Gelir: İstemci, belirli bir URL'ye HTTP isteği (örn.
GET /api/users/) gönderir.URL Yönlendirmesi (Routing): Django'nun
urls.pydosyası (veya DRF Router'ı) bu isteği yakalar ve ilgili View veya ViewSet'e yönlendirir.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.
Veritabanı Sorgusu (Model/ORM): View, veritabanından gerekli verileri çekmek için Django ORM'yi kullanarak Model ile iletişime geçer.
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).
Yanıt (Response): Oluşturulan JSON verisi, DRF'nin
Responsenesnesi içine sarılarak, uygun HTTP durum koduyla (örn.200 OKveya201 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ı:
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ü:
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:
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:
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-simplejwtpaketi 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-filtergibi 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
Yorum Gönder