Middle+
Ինչպես է Django-ում իրականացվում WebSocket-ի աշխատանքը?
sobes.tech AI
Պատասխան AI-ից
Django-ով WebSocket-ների հետ աշխատելը իրականացվում է արտաքին գրադարանների միջոցով, որոնցից ամենահայտնին Django Channels-ն է: Django Channels-ը ընդլայնում է Django-ի հնարավորությունները՝ ավելացնելով աջակցություն անսինխրոն պրոտոկոլների, ինչպիսիք են WebSocket-ները:
Հիմնական բաղադրիչները՝
- ASGI (Ասինխրոն Սերվեր Գեյթվեյ Ակնկալիչ): Ստանդարտ, որը փոխարինում է WSGI-ին և տրամադրում է ինտերֆեյս անսինխրոն վեբ սերվերների համար:
- Channels: Հիմնական գրադարան, որը տրամադրում է գործիքներ ASGI և WebSocket-ների աշխատանքի համար:
- Channel Layers: Կոմպոնենտ հաղորդագրությունների փոխանակման համար Django-ի օրինակների և այլ ծառայությունների միջև: Պահանջվում է բրոդկաստ հաղորդագրությունների և տարբեր աշխատանքային պրոցեսների միջև համակարգման համար:
Ինտեգրման գործընթացը՝
- Տեղադրում:
pip install channels daphne - Կարգավորումը
settings.py-ում:// settings.py INSTALLED_APPS = [ // ... այլ հավելվածներ 'channels', ] ASGI_APPLICATION = 'your_project_name.asgi.application' // ASGI հավելվածի ուղին - Ստեղծում
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 երթուղիներ ) ), }) - Ստեղծում
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})) - Ստեղծում
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-ների համար երթուղի ] - ASGI սերվեր: Ծրագիրը գործարկում ASGI սերվերով, օրինակ Daphne կամ Uvicorn:
daphne your_project_name.asgi:application
Այսպիսով, Django Channels-ը հնարավորություն է տալիս մշակել WebSocket հարցումները անսինխրոն, օգտագործելով Consumers-ներ լոգիկայի համար և Channel Layers հաղորդագրությունների փոխանակման համար։