Middle+
Django'da WebSocket ile çalışma nasıl gerçekleştirilir?
sobes.tech yapay zeka
AI'dan gelen yanıt
Django'da WebSocket ile çalışma, üçüncü taraf kütüphaneler kullanılarak gerçekleştirilir ve bunların en popüler olanı Django Channels'tır. Django Channels, Django'nun olanaklarını genişleterek WebSocket gibi asenkron protokolleri destekler.
Django Channels'ın temel bileşenleri:
- ASGI (Asenkron Sunucu Geçidi Arabirimi): WSGI'yi değiştiren ve asenkron web sunucuları için arabirim sağlayan standart.
- Channels: ASGI ve WebSocket ile çalışma araçları sağlayan ana kütüphane.
- Channel Layers: Django örnekleri ve diğer servisler arasında mesaj alışverişi için bileşen. Yayın mesajları ve farklı iş süreçleri arasında koordinasyon için gereklidir.
Entegrasyon süreci:
- Kurulum:
pip install channels daphne settings.py'de yapılandırma:// settings.py INSTALLED_APPS = [ // ... diğer uygulamalar 'channels', ] ASGI_APPLICATION = 'your_project_name.asgi.application' // ASGI uygulama yoluasgi.pydosyasının oluşturulması:// your_project_name/asgi.py import os from channels.auth import AuthMiddlewareStack // Kimlik doğrulama için from channels.routing import ProtocolTypeRouter, URLRouter // Yönlendirme için from channels.security.websocket import AllowedHostsOriginValidator // Güvenlik için from django.core.asgi import get_asgi_application // get_wsgi_application yerine from your_app_name import routing // WebSocket rotaları os.environ.setdefault("DJANGO_SETTINGS_MODULE", "your_project_name.settings") // get_asgi_application yerine kullanılır django_asgi_app = get_asgi_application() application = ProtocolTypeRouter({ "http": django_asgi_app, // HTTP istekleri standart şekilde işlenir "websocket": AllowedHostsOriginValidator( // WebSocket için yönlendirme AuthMiddlewareStack( // Opsiyonel, kimlik doğrulama için URLRouter(routing.websocket_urlpatterns) // WebSocket rotaları ) ), })consumers.pydosyasının oluşturulması: Bu, WebSocket bağlantılarını işleyen asenkron fonksiyonlar veya sınıflardır.// your_app_name/consumers.py import json from channels.generic.websocket import AsyncWebsocketConsumer // Asenkron consumer class ChatConsumer(AsyncWebsocketConsumer): async def connect(self): // Bağlantı kurulumu işlemi self.room_name = self.scope["url_route"]["kwargs"]["room_name"] self.room_group_name = f"chat_{self.room_name}" // Channel Layer grubuna katıl await self.channel_layer.group_add(self.room_group_name, self.channel_name) await self.accept() // Bağlantıyı kabul et async def disconnect(self, close_code): // Bağlantı kapatma işlemi await self.channel_layer.group_discard(self.room_group_name, self.channel_name) // Gruptan çık async def receive(self, text_data): // İstemciden gelen mesajların işlenmesi text_data_json = json.loads(text_data) message = text_data_json["message"] // Mesajı Channel Layer grubuna gönder await self.channel_layer.group_send( self.room_group_name, {"type": "chat.message", "message": message} ) async def chat_message(self, event): // Channel Layer'dan alınan mesajların işlenmesi message = event["message"] // Mesajı WebSocket üzerinden istemciye geri gönder await self.send(text_data=json.dumps({"message": message}))routing.pydosyasının oluşturulması: WebSocket bağlantıları için rotaların tanımlanması.// your_app_name/routing.py from django.urls import re_path // URL'de düzenli ifadeler için from . import consumers // consumers'ı içe aktar websocket_urlpatterns = [ re_path(r"ws/chat/(?P<room_name>\w+)/$", consumers.ChatConsumer.as_asgi()), // WebSocket için rota ]- ASGI sunucusu: Daphne veya Uvicorn gibi bir ASGI sunucusu kullanarak projeyi başlatma.
daphne your_project_name.asgi:application
Bu şekilde, Django Channels WebSocket isteklerini asenkron olarak işleyebilir, mantık için Consumers ve mesaj alışverişi için Channel Layers kullanılır.