Sobes.tech
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:

  1. ASGI (Asenkron Sunucu Geçidi Arabirimi): WSGI'yi değiştiren ve asenkron web sunucuları için arabirim sağlayan standart.
  2. Channels: ASGI ve WebSocket ile çalışma araçları sağlayan ana kütüphane.
  3. 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:

  1. Kurulum:
    pip install channels daphne
    
  2. settings.py'de yapılandırma:
    // settings.py
    
    INSTALLED_APPS = [
        // ... diğer uygulamalar
        'channels',
    ]
    
    ASGI_APPLICATION = 'your_project_name.asgi.application' // ASGI uygulama yolu
    
  3. asgi.py dosyası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ı
            )
        ),
    })
    
  4. consumers.py dosyası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}))
    
  5. routing.py dosyası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
    ]
    
  6. 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.