Sobes.tech
Middle+

Ako je implementovaná práca s WebSocket v Django?

sobes.tech AI

Odpoveď od AI

Práca s WebSocket v Django sa realizuje pomocou externých knižníc, z ktorých najpopulárnejšou je Django Channels. Django Channels rozširuje možnosti Django pridávaním podpory asynchrónnych protokolov, ako je WebSocket.

Hlavné komponenty Django Channels:

  1. ASGI (Asynchronous Server Gateway Interface): Štandard, ktorý nahrádza WSGI a poskytuje rozhranie pre asynchrónne webové servery.
  2. Channels: Hlavná knižnica poskytujúca nástroje na prácu s ASGI a WebSocket.
  3. Channel Layers: Komponent na výmenu správ medzi inštanciami Django a inými službami. Je nevyhnutný pre Broadcast správy a koordináciu medzi rôznymi pracovnými procesmi.

Proces integrácie:

  1. Inštalácia:
    pip install channels daphne
    
  2. Nastavenie settings.py:
    // settings.py
    
    INSTALLED_APPS = [
        // ... ďalšie aplikácie
        'channels',
    ]
    
    ASGI_APPLICATION = 'your_project_name.asgi.application' // Cesta k ASGI aplikácii
    
  3. Vytvorenie asgi.py:
    // your_project_name/asgi.py
    
    import os
    
    from channels.auth import AuthMiddlewareStack // Pre autentifikáciu
    from channels.routing import ProtocolTypeRouter, URLRouter // Pre routovanie
    from channels.security.websocket import AllowedHostsOriginValidator // Pre bezpečnosť
    from django.core.asgi import get_asgi_application // Nahrádza get_wsgi_application
    
    from your_app_name import routing // Cesty pre WebSocket
    
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "your_project_name.settings")
    # Používame get_asgi_application namiesto get_wsgi_application
    django_asgi_app = get_asgi_application()
    
    application = ProtocolTypeRouter({
        "http": django_asgi_app, // HTTP požiadavky sa spracúvajú štandardne
        "websocket": AllowedHostsOriginValidator( // Routovanie pre WebSocket
            AuthMiddlewareStack( // Voliteľné, pre autentifikáciu
                URLRouter(routing.websocket_urlpatterns) // Cesty pre WebSocket
            )
        ),
    })
    
  4. Vytvorenie consumers.py: Ide o asynchrónne funkcie alebo triedy, ktoré spracúvajú WebSocket spojenia.
    // your_app_name/consumers.py
    
    import json
    
    from channels.generic.websocket import AsyncWebsocketConsumer // Asynchrónny consumer
    
    class ChatConsumer(AsyncWebsocketConsumer):
        async def connect(self):
            // Spracovanie naviazania spojenia
            self.room_name = self.scope["url_route"]["kwargs"]["room_name"]
            self.room_group_name = f"chat_{self.room_name}"
    
            // Pripojenie ku skupine Channel Layer
            await self.channel_layer.group_add(self.room_group_name, self.channel_name)
    
            await self.accept() // Prijať spojenie
    
        async def disconnect(self, close_code):
            // Spracovanie ukončenia spojenia
            await self.channel_layer.group_discard(self.room_group_name, self.channel_name) // Odpojenie od skupiny
    
        async def receive(self, text_data):
            // Spracovanie prichádzajúcich správ od klienta
            text_data_json = json.loads(text_data)
            message = text_data_json["message"]
    
            // Odoslanie správy do skupiny Channel Layer
            await self.channel_layer.group_send(
                self.room_group_name, {"type": "chat.message", "message": message}
            )
    
        async def chat_message(self, event):
            // Spracovanie správ prijatých z Channel Layer
            message = event["message"]
    
            // Odoslanie správy späť klientovi cez WebSocket
            await self.send(text_data=json.dumps({"message": message}))
    
  5. Vytvorenie routing.py: Definovanie trás pre WebSocket spojenia.
    // your_app_name/routing.py
    
    from django.urls import re_path // Pre regulárne výrazy v URL
    
    from . import consumers // Import consumers
    
    websocket_urlpatterns = [
        re_path(r"ws/chat/(?P<room_name>\w+)/$", consumers.ChatConsumer.as_asgi()), // Trasa pre WebSocket
    ]
    
  6. ASGI server: Spustenie projektu s použitím ASGI servera, napríklad Daphne alebo Uvicorn.
    daphne your_project_name.asgi:application
    

Týmto spôsobom Django Channels umožňuje spracovávať WebSocket požiadavky asynchrónne, využívajúc Consumers pre logiku a Channel Layers pre medziprocesovú výmenu správ.