Sobes.tech
Middle+

Ինչպես է Django-ում իրականացվում WebSocket-ի աշխատանքը?

sobes.tech AI

Պատասխան AI-ից

Django-ով WebSocket-ների հետ աշխատելը իրականացվում է արտաքին գրադարանների միջոցով, որոնցից ամենահայտնին Django Channels-ն է: Django Channels-ը ընդլայնում է Django-ի հնարավորությունները՝ ավելացնելով աջակցություն անսինխրոն պրոտոկոլների, ինչպիսիք են WebSocket-ները:

Հիմնական բաղադրիչները՝

  1. ASGI (Ասինխրոն Սերվեր Գեյթվեյ Ակնկալիչ): Ստանդարտ, որը փոխարինում է WSGI-ին և տրամադրում է ինտերֆեյս անսինխրոն վեբ սերվերների համար:
  2. Channels: Հիմնական գրադարան, որը տրամադրում է գործիքներ ASGI և WebSocket-ների աշխատանքի համար:
  3. Channel Layers: Կոմպոնենտ հաղորդագրությունների փոխանակման համար Django-ի օրինակների և այլ ծառայությունների միջև: Պահանջվում է բրոդկաստ հաղորդագրությունների և տարբեր աշխատանքային պրոցեսների միջև համակարգման համար:

Ինտեգրման գործընթացը՝

  1. Տեղադրում:
    pip install channels daphne
    
  2. Կարգավորումը settings.py-ում:
    // settings.py
    
    INSTALLED_APPS = [
        // ... այլ հավելվածներ
        'channels',
    ]
    
    ASGI_APPLICATION = 'your_project_name.asgi.application' // ASGI հավելվածի ուղին
    
  3. Ստեղծում asgi.py:
    // your_project_name/asgi.py
    
    import os
    
    from channels.auth import AuthMiddlewareStack // Աутենտիկացիայի համար
    from channels.routing import ProtocolTypeRouter, URLRouter // Մարշրութավորման համար
    from channels.security.websocket import AllowedHostsOriginValidator // Անվտանգության համար
    from django.core.asgi import get_asgi_application // WSGI փոխարինող
    
    from your_app_name import routing // WebSocket-ների համար երթուղիներ
    
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "your_project_name.settings")
    # Օգտագործում ենք get_asgi_application փոխարեն get_wsgi_application
    django_asgi_app = get_asgi_application()
    
    application = ProtocolTypeRouter({
        "http": django_asgi_app, // HTTP հարցումները մշակվում են ստանդարտ կերպով
        "websocket": AllowedHostsOriginValidator( // WebSocket երթուղիներ
            AuthMiddlewareStack( // Ընտրովի, աութենտիկացիայի համար
                URLRouter(routing.websocket_urlpatterns) // WebSocket երթուղիներ
            )
        ),
    })
    
  4. Ստեղծում consumers.py: Սա է անսինխրոն ֆունկցիաներ կամ դասեր, որոնք մշակում են WebSocket կապերը:
    // your_app_name/consumers.py
    
    import json
    
    from channels.generic.websocket import AsyncWebsocketConsumer // Անսինխրոն consumer
    
    class ChatConsumer(AsyncWebsocketConsumer):
        async def connect(self):
            // Կապի հաստատման մշակումը
            self.room_name = self.scope["url_route"]["kwargs"]["room_name"]
            self.room_group_name = f"chat_{self.room_name}"
    
            // Միանալ խմբին Channel Layer-ով
            await self.channel_layer.group_add(self.room_group_name, self.channel_name)
    
            await self.accept() // Ընդունել կապը
    
        async def disconnect(self, close_code):
            // Կապի փակման մշակումը
            await self.channel_layer.group_discard(self.room_group_name, self.channel_name) // Ելք խմբից
    
        async def receive(self, text_data):
            // Մուտքային հաղորդագրությունների մշակումը
            text_data_json = json.loads(text_data)
            message = text_data_json["message"]
    
            // Հաղորդագրության ուղարկում խմբին Channel Layer-ով
            await self.channel_layer.group_send(
                self.room_group_name, {"type": "chat.message", "message": message}
            )
    
        async def chat_message(self, event):
            // Հաղորդագրությունների մշակումը, որոնք ստացվել են Channel Layer-ից
            message = event["message"]
    
            // Հաղորդագրության ուղարկում հաճախորդին WebSocket-ով
            await self.send(text_data=json.dumps({"message": message}))
    
  5. Ստեղծում routing.py: Մարշրութների սահմանում WebSocket կապերի համար:
    // your_app_name/routing.py
    
    from django.urls import re_path // Regexp-ների համար URL-ներում
    
    from . import consumers // Consumer-ների ներմուծում
    
    websocket_urlpatterns = [
        re_path(r"ws/chat/(?P<room_name>\w+)/$", consumers.ChatConsumer.as_asgi()), // WebSocket-ների համար երթուղի
    ]
    
  6. ASGI սերվեր: Ծրագիրը գործարկում ASGI սերվերով, օրինակ Daphne կամ Uvicorn:
    daphne your_project_name.asgi:application
    

Այսպիսով, Django Channels-ը հնարավորություն է տալիս մշակել WebSocket հարցումները անսինխրոն, օգտագործելով Consumers-ներ լոգիկայի համար և Channel Layers հաղորդագրությունների փոխանակման համար։