🌐 Django Channels : Le temps réel dans Django, enfin maîtrisé
🔍 Introduction
Django est historiquement basé sur le protocole HTTP, qui fonctionne en requête-réponse : le client envoie une requête, le serveur renvoie une réponse. Ce modèle ne permet pas le temps réel, essentiel pour des applications modernes comme :
- les chats en direct,
- les tableaux de bord dynamiques,
- les notifications instantanées,
- les jeux en ligne,
- les collaborations en temps réel.
🎯 C’est là que Django Channels entre en jeu !
🧠 C’est quoi Django Channels ?
Django Channels est une extension officielle de Django qui ajoute la prise en charge des protocoles asynchrones comme WebSocket ou HTTP2. Elle transforme Django en un framework asynchrone capable de gérer des connexions persistantes et concurrentes.
Il s’appuie sur :
- ASGI (Asynchronous Server Gateway Interface) → Le remplaçant de WSGI
- Redis pour la gestion des canaux (channels layers)
- Daphne comme serveur ASGI
🏗️ Architecture simplifiée
Voici les composants clés :
Client Web ↔ WebSocket ↔ Daphne (ASGI)
↓
Django Channels
↓
Consumers (Sync / Async)
↓
Redis Channel Layer
↓
Base de données
⚙️ Installation de Django Channels
pip install channels
Dans settings.py, ajouter :
INSTALLED_APPS = [
...
'channels',
]
ASGI_APPLICATION = 'votre_projet.asgi.application'
Créer un fichier asgi.py :
# asgi.py
import os
from django.core.asgi import get_asgi_application
from channels.routing import ProtocolTypeRouter, URLRouter
from channels.auth import AuthMiddlewareStack
import votre_app.routing
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "votre_projet.settings")
application = ProtocolTypeRouter({
"http": get_asgi_application(),
"websocket": AuthMiddlewareStack(
URLRouter(
votre_app.routing.websocket_urlpatterns
)
),
})
📡 Exemple de chat WebSocket
1. Créer un routeur Channels (routing.py)
# votre_app/routing.py
from django.urls import re_path
from . import consumers
websocket_urlpatterns = [
re_path(r'ws/chat/(?P<room_name>\w+)/$', consumers.ChatConsumer.as_asgi()),
]
2. Créer un Consumer WebSocket
# votre_app/consumers.py
import json
from channels.generic.websocket import AsyncWebsocketConsumer
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}"
# Join room group
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
)
# Receive message from WebSocket
async def receive(self, text_data):
data = json.loads(text_data)
message = data['message']
# Broadcast message
await self.channel_layer.group_send(
self.room_group_name,
{
"type": "chat_message",
"message": message
}
)
# Receive message from group
async def chat_message(self, event):
await self.send(text_data=json.dumps({
"message": event["message"]
}))
3. Configuration de Redis pour les Channel Layers
Installez Redis et channels_redis :
pip install channels_redis
Ajoutez dans settings.py :
CHANNEL_LAYERS = {
"default": {
"BACKEND": "channels_redis.core.RedisChannelLayer",
"CONFIG": {
"hosts": [("127.0.0.1", 6379)],
},
},
}
4. Client HTML (simple)
<input id="messageInput" />
<button onclick="sendMessage()">Send</button>
<ul id="chatBox"></ul>
<script>
const roomName = "general";
const chatSocket = new WebSocket(
'ws://' + window.location.host + '/ws/chat/' + roomName + '/'
);
chatSocket.onmessage = function(e) {
const data = JSON.parse(e.data);
const el = document.createElement("li");
el.innerText = data.message;
document.getElementById("chatBox").appendChild(el);
};
function sendMessage() {
const input = document.getElementById("messageInput");
chatSocket.send(JSON.stringify({ message: input.value }));
input.value = '';
}
</script>
🧪 Développement local
Démarrez Redis puis :
python manage.py runserver
🧰 Bonus : Cas d’usage réels
- Notifications temps réel (mail, push, alertes)
- Mise à jour de tableaux de bord
- Collaborations (docs partagés, whiteboard)
- Jeux multijoueurs
- Support utilisateur instantané
📚 Ressources utiles
✅ Conclusion
Django Channels permet de dépasser les limites du modèle classique de Django. Grâce à lui, tu peux créer des applications modernes, réactives et interactives. Que ce soit pour un simple chat ou une app médicale temps réel, Channels est un atout puissant à maîtriser.