Django Channels Consumer не подключается к websocket

я создал вебсокет с яваскриптами на стороне клиента... затем настроил свой проект для обработки вебсокетных соединений следующим образом (следуя официальной документации django-channels). Но каждый раз, когда я обновляю страницу и просматриваю вебсокет из консоли браузера... он не работает. Я вставил оператор print в init класса consumer и он был напечатан (каждый раз, когда страница, содержащая вебсокет, была посещена или обновлена)... Это означает, что маршрутизация работает нормально... но по некоторым причинам потребитель не соединяется/принимает соединение, как ожидалось, с вебсокетом. И опять же, нет никакого журнала на сервере разработки о любом процессе соединения с вебсокетом. Пожалуйста, кто-нибудь может помочь и предложить исправление.

мой файл setting.py (соответствующие строки)
INSTALLED_APPS = [
    ...
    'channels',
]


ASGI_APPLICATION = 'ma_mall.asgi.application'

CHANNEL_LAYERS = {
    "default": {
        'BACKEND': "channels_redis.core.RedisChannelLayer",
        "CONFIG": {
            'hosts': [('127.0.0.1', 6379)],
        }
    }
}

мой файл asgi.py
application = ProtocolTypeRouter({
    "http": get_asgi_application(),
    "websocket": URLRouter(
            routing.websocket_urlpatterns            
        )
})

мой файл routing.py

websocket_urlpatterns = [
    path("ws/notifications/", consumers.NotificationConsumer),
]
мое потребительское досье
class NotificationConsumer(AsyncJsonWebsocketConsumer):
    groups = ['general_group']

    async def connect(self):
        await self.accept()
        await self.channel_layer.group_add('notification_group', self.channel_name)
        await self.channel_layer.group_send('notification_group', 
            {
                'type': 'tester.message',
                'tester': 'tester'
            }
        )
        
    async def disconnect(self, close_code):
        await self.channel_layer.group_discard('notification_group', self.channel_name)

javascript для вебсокета на стороне клиента

я создал веб-сокет на стороне клиента с помощью javascript следующим образом

       const notification_websocket = new WebSocket(
            'ws://' +
            window.location.host +
            '/ws/notifications/'
        );

        notification_websocket.onmessage = function (e) {
            let data = JSON.parse(e.data);
            console.log("Just received this from the back end.. 0", data);
        }

        notification_websocket.onclose = function (e) {
            console.log("websocket closed");
        }

Я не очень хорошо понял каналы, но я помню, что у меня были такие же проблемы некоторое время назад, и я решил их, добавив функцию, называемую как параметр типа, как в примерах.

class NotificationConsumer(AsyncJsonWebsocketConsumer):
    groups = ['general_group']

    async def connect(self):
        await self.accept()
        await self.channel_layer.group_add('notification_group', self.channel_name)
        await self.channel_layer.group_send('notification_group', 
            {
                'type': 'tester.message',
                'tester': 'tester'
            }
        )
        
    async def disconnect(self, close_code):
        await self.channel_layer.group_discard('notification_group', self.channel_name)

    def tester_message(self, event):
        self.send(text_data=event["tester"])

я понял, что использовал старую версию Redis (чтобы обойти использование Redis на Windows), и проблема возникла из-за части конфигурации Redis. Как только я перешел от использования Redis к использованию Memcache

CHANNEL_LAYERS = {
    "default": {
        "BACKEND": "channels.layers.InMemoryChannelLayer"
    }
}

соединение websocket-consumer подключилось и оставалось открытым, как и ожидалось... я надеюсь найти решение для использования Redis новой версии на Windows для разработки

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