Django Channels получать сообщение от группы комнат, похоже, не работает

Я пытаюсь построить систему уведомлений, используя Django Channels. Я завершил начальную настройку и когда я запускаю свой сервер, я получаю подтверждение Handshake и подтверждение соединения. Однако, когда я просматриваю журнал консоли, я не могу увидеть сообщение, которое должно быть отправлено. Я также поместил оператор печати в функцию send_notification, но он никогда не достигается. Я новичок в использовании Django Channels, поэтому любая помощь будет принята с благодарностью. Что я делаю неправильно?

Вот моя настройка ASGI файла:

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'clicksource.settings')
from channels.auth import AuthMiddleware, AuthMiddlewareStack
from notifications.routing import websocket_urlpatterns
application = ProtocolTypeRouter({
    "http": get_asgi_application(),
    "websocket": AuthMiddlewareStack(
        URLRouter(
            websocket_urlpatterns
        )
    )
})

Вот мой consumers.py:

import json
from channels.generic.websocket import AsyncWebsocketConsumer

class NotificationConsumer(AsyncWebsocketConsumer):
    async def connect(self):
        self.room_name = self.scope['url_route']['kwargs']['room_name']
        self.room_group_name = 'notification_%s' % 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):
        # Leave room group
        await self.channel_layer.group_discard(
            self.room_group_name,
            self.channel_name
        )

    # Receive message from room group
    async def send_notification(self, event):
        message = event['message']

        # Send message to WebSocket
        await self.send(text_data=json.dumps({
            'message':message
        }))

Вот мой файл routing.py:

from django.urls import re_path

from . import consumers

websocket_urlpatterns = [
    re_path(r'ws/notification/(?P<room_name>\w+)/$', consumers.NotificationConsumer.as_asgi()),
]

И сценарий в моем файле base.html:

    <script>
    const roomName = JSON.parse(document.getElementById('room-name').textContent);

    const notificationSocket = new WebSocket(
        'ws://'
        + window.location.host
        + '/ws/notification/'
        + roomName
        + '/'
    );

    notificationSocket.onmessage = function(e) {
        const data = JSON.parse(e.data);
        //document.querySelector('#chat-log').value += (data.message + '\n');
        console.log(data);
        document.getElementById("notifications-dropdown").innerHTML = "<li class='dropdown-item'>" + data + "</li><hr class='dropdown-divider'>" + document.getElementById("notifications-dropdown").innerHTML;
        document.getElementById("notification-badge").innerHTML = parseInt(document.getElementById("notification-badge").innerHTML) + 1;
    };

    notificationSocket.onclose = function(e) {
        console.error('Chat socket closed unexpectedly');
    };
</script>

Вам необходимо определить метод .receive() на NotificationConsumer. Каждый раз, когда клиент посылает сообщение, .receive() получает его и передает эхом обратно в группу, а затем все подписанные на эту группу получают его.

Посмотрите эту ссылку: https://channels.readthedocs.io/en/stable/tutorial/part_3.html

Вернуться на верх