Django Channels
Django Channels расширяет Django для поддержки WebSocket, задач и других асинхронных протоколов.
Установка
Настройка
Создание Consumer
1# consumers.py
2import json
3from channels.generic.websocket import AsyncWebsocketConsumer
4
5class ChatConsumer(AsyncWebsocketConsumer):
6 async def connect(self):
7 await self.channel_layer.group_add("chat", self.channel_name)
8 await self.accept()
9
10 async def disconnect(self, close_code):
11 await self.channel_layer.group_discard("chat", self.channel_name)
12
13 async def receive(self, text_data):
14 data = json.loads(text_data)
15 await self.channel_layer.group_send("chat", {
16 'type': 'chat_message',
17 'message': data['message']
18 })
19
20 async def chat_message(self, event):
21 await self.send(text_data=json.dumps({
22 'message': event['message']
23 }))
Настройка routing
1# routing.py
2from django.urls import re_path
3from . import consumers
4
5websocket_urlpatterns = [
6 re_path(r'ws/chat/(?P<room_name>\w+)/$', consumers.ChatConsumer.as_asgi()),
7]
8
9# asgi.py
10import os
11from django.core.asgi import get_asgi_application
12from channels.routing import ProtocolTypeRouter, URLRouter
13from channels.auth import AuthMiddlewareStack
14from .routing import websocket_urlpatterns
15
16os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings')
17
18application = ProtocolTypeRouter({
19 "http": get_asgi_application(),
20 "websocket": AuthMiddlewareStack(
21 URLRouter(websocket_urlpatterns)
22 ),
23})
FAQ
Q: Нужен ли Redis?
A: Для production да, для разработки можно использовать InMemoryChannelLayer.
Q: Как аутентифицировать WebSocket соединения?
A: Используй AuthMiddlewareStack для проверки аутентификации.