iggy12345
iggy12345

Reputation: 1383

django channels websocket closes during handshake

I'm trying to integrate a simple chat room into my current website project using this tutorial from the channels readthedocs https://channels.readthedocs.io/en/latest/tutorial/index.html

When I try to load the homepage for my website which should automatically connect to the global chat, I get this

backend console

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 console

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

I'm not really sure what code I should give you guys for my example, but here is the code for my consumer, and my settings

consumers.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 (truncated)

# 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)]
        },
    }
}

I tried looking at other posts, but they all seem to use an outdated version, can I get a more up to date answer?

Upvotes: 3

Views: 2689

Answers (1)

VMatić
VMatić

Reputation: 996

You're using the synchronous WebSocketConsumer whereas you've re-written your code to be asynchronous. You should therefore write:

class ChatConsumer(AsyncWebsocketConsumer):

Compare your consumers.py to that in the tutorial.

Upvotes: 6

Related Questions