Formation incluse

Django Channels : Le temps réel dans Django, enfin maîtrisé

Donald Porgrammeur
Donald Porgrammeur
24 Rechercher 2025 · 7,00 min lecture
1
Django
Django Channels : Le temps réel dans Django, enfin maîtrisé

 

🌐 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.

 

1

Applaudissez pour montrer votre soutien

Donald Porgrammeur

Donald Porgrammeur

5 Suivez-nous · Rédacteur pour Django

Tedom Noutchogouin Donald est Software Architect, DevOps Engineer et Machine Learning Engineer, fondateur de HooYia, une entreprise technologique spé… Lire la suite