【问题标题】:Websocket does not receive a message from django channels server even though they are connectedWebsocket 没有收到来自 django 通道服务器的消息,即使它们已连接
【发布时间】:2022-12-18 14:59:08
【问题描述】:

我目前正在构建一个带有 Django 通道的应用程序。
我有一个连接到服务器的 websocket。查看我的终端,似乎 websocket 已成功连接到服务器。

HTTP GET / 200 [0.01, 127.0.0.1:62087]
HTTP GET /static/video/js/websocket.js 200 [0.00, 127.0.0.1:62087]
WebSocket HANDSHAKING /ws/video [127.0.0.1:62089]
WebSocket CONNECT /ws/video [127.0.0.1:62089]

但是,websocket 没有收到服务器发送的消息。

这是我的代码:
消费者.py

import json
from channels.generic.websocket import WebsocketConsumer
from asgiref.sync import async_to_sync

class VideoConsumer(WebsocketConsumer):
    def connect(self):
        self.accept()
        self.send(json.dumps({'message': 'you are connected!'}))   

网络套接字.js

const address = 'ws://' + window.location.host + '/ws/video'
const websocket = new WebSocket(address)

const btn = document.getElementById('myButton')

websocket.onopen = (event) => {
  console.log('websocket connected!!!')
}

websocket.onmessage = (event) => {
  console.log(event.data)
}

我想收到消息“您已连接!”在我的浏览器控制台上。 我查看了官方的 django 频道文档,并在谷歌上搜索了解决方案,但未能解决我的问题。我在这里错过了什么?

【问题讨论】:

    标签: python django websocket django-channels


    【解决方案1】:

    该问题与上述代码无关。
    我已经通过编辑我的解决了这个问题asgi.py在项目文件夹下。

    import os
    from django.core.asgi import get_asgi_application
    from channels.routing import ProtocolTypeRouter, URLRouter
    from channels.security.websocket import AllowedHostsOriginValidator
    from channels.auth import AuthMiddlewareStack
    import video.routing
    
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'VideoChat.settings')
    
    application = ProtocolTypeRouter(
        {
            'http': get_asgi_application(),
            'websocket': AllowedHostsOriginValidator(
                AuthMiddlewareStack(URLRouter(video.routing.websocket_urlpatterns))
            )
        }
    )
    

    如您所见,我用AllowedHostsOriginValidator 包装了AuthMiddlewareStack(URLRouter(video.routing.websocket_urlpatterns))。在我把AllowedHostsOriginValidator'websocket': AuthMiddlewareStack(URLRouter(video.routing.websocket_urlpatterns))去掉后,问题就完美解决了。

    p.s: 我注意到websocket仍然可以连接到之前的设置。它既不发送消息也不从服务器接收消息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-30
      • 2021-06-26
      • 1970-01-01
      相关资源
      最近更新 更多