Django Channels

Django Channels расширяет Django для поддержки WebSocket, задач и других асинхронных протоколов.

Установка

1# Установка пакета
2pip install channels channels-redis
1# Или через Poetry
2poetry add channels channels-redis

Настройка

 1# settings.py
 2INSTALLED_APPS = [
 3    'channels',
 4]
 5
 6ASGI_APPLICATION = 'myproject.asgi.application'
 7
 8CHANNEL_LAYERS = {
 9    'default': {
10        'BACKEND': 'channels_redis.core.RedisChannelLayer',
11        'CONFIG': {
12            'hosts': [('127.0.0.1', 6379)],
13        },
14    },
15}

Создание 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 для проверки аутентификации.