В синхронной версии Django для реализации отправки сообщений в реальном времени можно использовать Django Channels, которая предоставляет средства для работы с протоколом WebSocket.
Для начала установите channels
:
pip install channels
Затем добавьте 'channels'
в INSTALLED_APPS
в файле settings.py
вашего Django-приложения:
INSTALLED_APPS = [ ... 'channels', ... ]
После этого создайте файл routing.py
в корневой директории вашего проекта, чтобы настроить маршрутизацию WebSocket-соединений:
from channels.routing import ProtocolTypeRouter, URLRouter from myapp import routing # замените `myapp` на имя вашего приложения application = ProtocolTypeRouter({ 'http': get_asgi_application(), 'websocket': AuthMiddlewareStack( URLRouter( routing.websocket_urlpatterns ) ), })
В файле routing.py
вы должны импортировать URLRouter
из channels.routing
и определить application
с помощью ProtocolTypeRouter
. Здесь мы также используем AuthMiddlewareStack
для обеспечения аутентификации WebSocket-соединений. Укажите путь к вашему файлу маршрутизации в URLRouter
.
Затем создайте файл consumers.py
в вашем приложении, где будет содержаться логика обработки WebSocket-сообщений:
from channels.generic.websocket import WebsocketConsumer class MyConsumer(WebsocketConsumer): def connect(self): self.accept() def disconnect(self, close_code): pass def receive(self, text_data): # Здесь вы можете обрабатывать полученные сообщения в реальном времени self.send(text_data=text_data)
Каждый WebSocket-консьюмер должен быть унаследован от WebsocketConsumer
. В методе connect
мы принимаем соединение, а метод disconnect
необходим для закрытия соединения со стороны клиента. Метод receive
вызывается при получении сообщений, здесь вы можете обрабатывать и отправлять сообщения в реальном времени.
Далее, в файле myapp.routing.py
(где myapp
заменяется на имя вашего приложения), определите пути URL для веб-сокетов:
from django.urls import re_path from . import consumers websocket_urlpatterns = [ re_path(r'ws/mywebsocket/$', consumers.MyConsumer.as_asgi()), ]
Определите путь URL для вашего WebSocket-консюмера в websocket_urlpatterns
как регулярное выражение, ссылающееся на ваш класс консьюмера.
Наконец, добавьте ASGI_APPLICATION = 'yourproject.routing.application'
в файле settings.py
, где 'yourproject'
заменяется на имя вашего проекта.
Теперь, когда в вашем приложении происходит отправка сообщений через ваш WebSocket-консюмер, они будут доставляться в реальном времени.
Обратите внимание, что этот пример основан на синхронной версии Django. Для асинхронной версии с asyncio
вам нужно будет использовать другой набор классов и функций из channels
.