Как в контексте синхронной джанги заставить channels отправлять сообщения в реальном времени?

В синхронной версии 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.