Modern web, geleneksel istek-yanıt döngüsünden çok daha ötesine evrildi. Canlı sohbet uygulamalarından işbirlikli belge düzenleyicilere, gerçek zamanlı borsa endekslerinden oyun liderlik tablolarına kadar kullanıcılar artık anında geri bildirim bekliyor. Django uzun süredir sağlam arka uç geliştirme için altın standart olsa da, senkron yapısı geleneksel olarak bu kalıcı, uzun ömürlü bağlantılar için daha az uygun hale getiriyordu. İşte Django Channels devreye giriyor.
Bu rehberde, Django 5.0'ın Channels kütüphanesi ile birleştiğinde Django projenizi WebSockets'i verimli bir şekilde işleyebilen bir ASGI (Asenkron Sunucu Ağ Geçidi Arayüzü) uygulamasına nasıl dönüştüreceğini keşfedeceğiz. Bu makale, geleneksel Django görünümleri ile gerçek zamanlı iletişim arasındaki boşluğu doldurmak isteyen orta ve ileri düzey geliştiriciler için tasarlanmıştır.
Mimariyi Anlamak: WSGI vs. ASGI
Channels'da ustalaşmak için önce altta yatan protokol değişikliğini anlamalısınız. Standart Django uygulamaları WSGI üzerinde çalışır; bu senkron ve durum bilgisi içermeyen (stateless) bir yapıdır. Her HTTP isteği işlenir, işlenir ve ardından bağlantı kesilir. Ancak WebSockets, etkileşim süresince açık kalacak kalıcı bir bağlantı gerektirir.
Django Channels, Django'yu Uvicorn veya Daphne gibi bir ASGI sunucusunun içine sararak HTTP/2, uzun pollama ve standart HTTP isteklerinin yanı sıra WebSockets'i de işleyebilmesini sağlar. Django 5.0, çekirdek yardımcı programlarında daha iyi asenkron desteği ile bu entegrasyonu iyileştirir; bu da Python'un asyncio kütüphanesine aşina geliştiriciler için geçişi daha kolay hale getirir.
Çevrenizi Hazırlama
Koda dalmadan önce temiz bir Django 5.0 projesine sahip olduğunuzdan emin olun. Channels kütüphanesini ve bir ASGI sunucusunu yüklemeniz gerekecektir. Üretim (production) ortamı için performansı nedeniyle Uvicorn şiddetle tavsiye edilir.
pip install channels uvicorn gunicorn
settings.py dosyanızda INSTALLED_APPS içine 'channels' eklemeniz ve ASGI uygulamasını yapılandırmanız gerekir. Bu, Django'ya gelen bağlantılar için giriş noktası olarak Channels'ı kullanmasını söyler.
# settings.py
INSTALLED_APPS = [
# ...
'channels',
]
ASGI_APPLICATION = 'myproject.asgi.application'
Bir WebSocket Consumer (Tüketici) Oluşturma
Django ekosisteminde bir WebSocket işleyicisine "Consumer" (Tüketici) denir. Consumers, Django Views'e benzer ancak doğaları gereği asenkronlardır. WebSocket bağlantısını kabul eden ve mesajları istemciye geri yansıtan basit bir consumer oluşturalım.
Uygulama dizininizde consumers.py adında bir dosya oluşturun:
# consumers.py
import json
from channels.generic.websocket import AsyncWebsocketConsumer
class ChatConsumer(AsyncWebsocketConsumer):
async def connect(self):
self.room_name = 'general'
self.room_group_name = f'chat_{self.room_name}'
# Odaya katıl
await self.channel_layer.group_add(
self.room_group_name,
self.channel_name
)
await self.accept()
async def disconnect(self, close_code):
# Odadan ayrıl
await self.channel_layer.group_discard(
self.room_group_name,
self.channel_name
)
# WebSocket'ten mesaj al
async def receive(self, text_data):
text_data_json = json.loads(text_data)
message = text_data_json['message']
# Mesajı oda grubuna gönder
await self.channel_layer.group_send(
self.room_group_name,
{
'type': 'chat_message',
'message': message
}
)
# Oda grubundan mesaj al
async def chat_message(self, event):
message = event['message']
# Mesajı WebSocket'e gönder
await self.send(text_data=json.dumps({
'message': message
}))
AsyncWebsocketConsumer, bir WebSocket bağlantısının yaşam döngüsünü yönetmek için temiz bir arayüz sağlar. connect yöntemi, kullanıcıları doğruladığınız veya belirli odalara (gruplara) katıldığınız yerdir. channel_layer, Channels'ın omurgasıdır ve farklı süreçlerin birbirleriyle iletişim kurmasını sağlar.
WebSockets'i Yönlendirme
HTTP URL'lerini görünümlere yönlendirdiğiniz gibi, WebSocket URL'lerini de consumers'a yönlendirmeniz gerekir. Uygulamanızda bir routing.py dosyası oluşturun:
# routing.py
from django.urls import re_path
from . import consumers
websocket_urlpatterns = [
re_path(r'ws/chat/(?P\w+)/$', consumers.ChatConsumer.as_asgi()),
]
Ardından, projenizin asgi.py dosyasında bu yönlendirmeleri dahil edin:
# myproject/asgi.py
import os
from django.core.asgi import get_asgi_application
from channels.routing import ProtocolTypeRouter, URLRouter
from channels.auth import AuthMiddlewareStack
import chat.routing
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings')
application = ProtocolTypeRouter({
"http": get_asgi_application(),
"websocket": AuthMiddlewareStack(
URLRouter(
chat.routing.websocket_urlpatterns
)
),
})
Sonuç
Django 5.0 ve Django Channels, tam yığın (full-stack) gerçek zamanlı uygulamalar oluşturmak için güçlü ve birleşik bir çerçeve sağlar. Asenkron kodu ve Channel Layer'ı kullanarak, Django'nun güvenlik ve ORM avantajlarından vazgeçmeden canlı bildirimler, çok oyunculu oyunlar ve işbirlikli araçlar gibi karmaşık özellikler oluşturabilirsiniz. Keşfinize devam ederken, üretim ortamlarında ölçeklenebilirlik için kanal katmanı arka ucu olarak Redis'i entegre etmeyi düşünün. Bu araçlarda ustalaşmak, Python arka uç geliştiricisi olarak yeteneklerinizi önemli ölçüde genişletecektir.