Веб-сокет каналов django закрывается во время рукопожатия

Я пытаюсь интегрировать простую чат-комнату в свой текущий проект веб-сайта, используя это руководство из channels readthedocs https://channels.readthedocs.io/en/latest/tutorial/index.html

Когда я пытаюсь загрузить домашнюю страницу своего веб-сайта, которая должна автоматически подключаться к глобальному чату, я получаю следующее:

внутренняя консоль

HTTP GET / 200 [0.01, 127.0.0.1:58286]
HTTP GET /static/chatroom/base.css 304 [0.00, 127.0.0.1:58286]
HTTP GET /static/chatroom/images/profiles/anonymous.jpg 304 [0.00, 127.0.0.1:58288]
HTTP GET /static/chatroom/images/background.jpg 304 [0.00, 127.0.0.1:58288]
WebSocket HANDSHAKING /ws/chat/global/ [127.0.0.1:58290]
WebSocket DISCONNECT /ws/chat/global/ [127.0.0.1:58282]

консоль javascript

Firefox can’t establish a connection to the server at ws://127.0.0.1:8000/ws/chat/global/. 127.0.0.1:8000:59:23
Socket error: [object WebSocket] 127.0.0.1:8000:69:17
Chat socket closed unexpectedly: 1006

Я не совсем уверен, какой код я должен дать вам, ребята, для моего примера, но вот код для моего потребителя и мои настройки

потребители.py

# chat/consumers.py
import json
from channels.generic.websocket import WebsocketConsumer
from asgiref.sync import async_to_sync


class ChatConsumer(WebsocketConsumer):
    async def connect(self):
        self.room_name = 'global'
        self.room_group_name = 'chat_%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 WebSocket
    async def receive(self, text_data=None, bytes_data=None):
        text_data_json = json.loads(text_data)
        message = text_data_json['message']

        # Send message to room group
        await self.channel_layer.group_send(
            self.room_group_name,
            {
                'type': 'chat_message',
                'message': message
            }
        )

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

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

settings.py (усеченный)

# chatroom settings
# https://channels.readthedocs.io/en/latest/tutorial/part_2.html

ASGI_APPLICATION = 'mysite.routing.application'
CHAT_PORT = 7580
CHANNEL_LAYERS = {
    'default': {
        'BACKEND': 'channels_redis.core.RedisChannelLayer',
        'CONFIG': {
            "hosts": ['redis://localhost:{}'.format(CHAT_PORT)]
        },
    }
}

Я пробовал посмотреть другие сообщения, но все они, похоже, используют устаревшую версию. Могу ли я получить более свежий ответ?


person iggy12345    schedule 05.07.2020    source источник


Ответы (1)


Вы используете синхронный WebSocketConsumer, тогда как вы переписали свой код так, чтобы он был асинхронным. Поэтому вам следует написать:

class ChatConsumer(AsyncWebsocketConsumer):

Сравните ваш consumers.py с этим в руководстве.

person VMatić    schedule 05.07.2020