Implementing Real-Time Notifications with Django Channels and WebSockets
In today’s fast-paced digital world, users expect real-time updates and notifications. Whether it’s a new message, a like on a post, or a live chat, real-time functionality is essential for modern web applications. Django, a powerful Python web framework, can handle real-time features using Django Channels and WebSockets.
In this blog post, we’ll walk through how to implement real-time notifications in a Django application. By the end, you’ll have a working example of real-time notifications using Django Channels.
Prerequisites
Before we begin, ensure you have the following:
- Python 3.7+ installed
- Django installed (
pip install django) - Django Channels installed (
pip install channels) - Basic knowledge of Django (models, views, templates)
Step 1: Set Up a Django Project
-
Create a new Django project:
django-admin startproject realtime_notifications cd realtime_notifications -
Create a new app:
python manage.py startapp notifications -
Add
notificationsandchannelstoINSTALLED_APPSinsettings.py:INSTALLED_APPS = [ ... 'notifications', 'channels', ]
Step 2: Configure Django Channels
-
Update
settings.pyto use Channels as the default ASGI application:ASGI_APPLICATION = 'realtime_notifications.asgi.application' -
Install Redis as the channel layer backend (for production):
pip install channels_redis -
Configure the channel layer in
settings.py:CHANNEL_LAYERS = { 'default': { 'BACKEND': 'channels_redis.core.RedisChannelLayer', 'CONFIG': { 'hosts': [('127.0.0.1', 6379)], }, }, }
Step 3: Create a Notification Model
In notifications/models.py, define a simple Notification model:
from django.db import models
from django.contrib.auth.models import User
class Notification(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
message = models.CharField(max_length=255)
read = models.BooleanField(default=False)
created_at = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.message
Run migrations to create the database table:
python manage.py makemigrations
python manage.py migrate
Step 4: Set Up WebSocket Consumers
-
Create a
consumers.pyfile in thenotificationsapp:import json from channels.generic.websocket import AsyncWebsocketConsumer class NotificationConsumer(AsyncWebsocketConsumer): async def connect(self): self.user = self.scope['user'] self.group_name = f'notifications_{self.user.id}' # Join the group await self.channel_layer.group_add( self.group_name, self.channel_name ) await self.accept() async def disconnect(self, close_code): # Leave the group await self.channel_layer.group_discard( self.group_name, self.channel_name ) async def send_notification(self, event): # Send notification to WebSocket await self.send(text_data=json.dumps(event['message'])) -
Update
routing.pyto route WebSocket connections:from django.urls import re_path from . import consumers websocket_urlpatterns = [ re_path(r'ws/notifications/(?P<user_id>\w+)/$', consumers.NotificationConsumer.as_asgi()), ] -
Update the project’s
asgi.pyto include WebSocket routing:import os from django.core.asgi import get_asgi_application from channels.routing import ProtocolTypeRouter, URLRouter from notifications import routing os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'realtime_notifications.settings') application = ProtocolTypeRouter({ 'http': get_asgi_application(), 'websocket': URLRouter(routing.websocket_urlpatterns), })
Step 5: Create Views and Templates
-
In
notifications/views.py, create a view to send notifications:from django.shortcuts import render from django.contrib.auth.decorators import login_required from channels.layers import get_channel_layer from asgiref.sync import async_to_sync from .models import Notification @login_required def send_notification(request): if request.method == 'POST': message = request.POST.get('message') notification = Notification.objects.create(user=request.user, message=message) # Send notification via WebSocket channel_layer = get_channel_layer() async_to_sync(channel_layer.group_send)( f'notifications_{request.user.id}', { 'type': 'send_notification', 'message': {'message': message} } ) return render(request, 'notifications/send.html', {'success': True}) return render(request, 'notifications/send.html') -
Create a template (
notifications/templates/notifications/send.html):<!DOCTYPE html> <html> <head> <title>Send Notification</title> </head> <body> <h1>Send Notification</h1> {% if success %} <p>Notification sent!</p> {% endif %} <form method="post"> {% csrf_token %} <textarea name="message" placeholder="Enter your message"></textarea> <button type="submit">Send</button> </form> </body> </html>
Step 6: Test the Application
-
Run the development server:
python manage.py runserver -
Open the browser and navigate to the notification page.
-
Send a notification and see it appear in real-time!
This is just the beginning—you can extend this functionality to include live chat, real-time updates, and more. Django Channels opens up a world of possibilities for building dynamic, real-time web applications.
Labels: Implementing Real-Time Notifications with Django Channels and WebSockets
