Add real-time WebSocket chat with Django Channels and Redis channel layer.
WebSockets with Django Channels
pip install channels channels-redis
# settings.py
INSTALLED_APPS += ["channels"]
ASGI_APPLICATION = "mysite.asgi.application"
CHANNEL_LAYERS = {"default": {
"BACKEND": "channels_redis.core.RedisChannelLayer",
"CONFIG": {"hosts": [("127.0.0.1", 6379)]}
}}
from channels.generic.websocket import AsyncWebsocketConsumer
import json
class ChatConsumer(AsyncWebsocketConsumer):
async def connect(self):
room = self.scope["url_route"]["kwargs"]["room"]
self.group = "chat_" + room
await self.channel_layer.group_add(self.group, self.channel_name)
await self.accept()
async def receive(self, text_data):
data = json.loads(text_data)
await self.channel_layer.group_send(
self.group,
{"type": "chat.message", "message": data["message"]}
)
async def chat_message(self, event):
await self.send(text_data=json.dumps({"message": event["message"]}))