未处理 Django 频道 websocket.receive

Posted

技术标签:

【中文标题】未处理 Django 频道 websocket.receive【英文标题】:Django channels websocket.receive is not handled 【发布时间】:2016-07-12 07:11:10 【问题描述】:

我正在尝试通过文档实现 Django 频道。 所以就像我正在制作的文档一样consumers.py

def ws_message(message):
    message.reply_channel.send(
        "text": message.content['text'],
)

routing.py

from channels.routing import route
from my_proj.consumers import ws_message

channel_routing = [
    route("websocket.receive", ws_message),
]

在我的settings 文件中,我添加了channel_layers

CHANNEL_LAYERS = 
    "default": 
        "BACKEND": "asgi_redis.RedisChannelLayer",
        "CONFIG": 
            "hosts": [("localhost", 6379)],
        ,
        "ROUTING": "my_proj.routing.channel_routing",
    ,

所以当我运行服务器并在 chrome 控制台中发送以下内容

socket = new WebSocket("ws://" + 192.168.4.177:8000");
socket.onmessage = function(e) 
    alert(e.data);

socket.onopen = function() 
    socket.send("something");

我可以在 manage.py 控制台中看到 Websocket 连接正常工作并建立了连接,但 receive 部分未处理且未在控制台中看到,因此不会引发来自 js 代码的警报。那我做错了什么?

【问题讨论】:

@UtkarshSinha 这没有效果。我再次可以看到连接但看不到接收。 尝试以 JSON 格式发送数据。我认为它可能无法从消息中选择“文本”,如下所示: socket.send(JSON.stringify("text": "something")); @UtkarshSinha 我试过了,还是没有运气。再提一下。我认为选择“文本”不是问题(主要是因为示例来自 Channels 文档)。你看,在manage.py runworker v2 的控制台中,我没有看到runworker - websocket.receive 调试消息。意味着发送没有到达消费者。 @UtkarshSinha 当我在一个空的应用程序中尝试我所描述的问题时,它可以工作。但我在一个真正的应用程序中尝试这不起作用。我的 settings.py 文件中的某些内容是否可能会阻止 receive 不是真的,因为你的 websocket.connect 工作正常。 【参考方案1】:

问题出在 Twisted 的版本上。到目前为止,它的最新版本是 16.3.0,但频道需要 16.2.0 版本。因此,对于 16.2.0 版本的 Twisted,它可以正常工作。

【讨论】:

在这个问题上失去了 2 小时的生命,我降级到 16.2.0 并开始工作。非常感谢您分享答案! 拯救了我的一天!非常感谢:)

以上是关于未处理 Django 频道 websocket.receive的主要内容,如果未能解决你的问题,请参考以下文章

Django Channels - 未执行连接

Django Channels - 握手和连接,但未执行 websocket.connect 函数

Django - Celery Worker - 频道

Django 频道:消息在一个频道中重复

使用 django 频道时如何使用频道而不是组?

Django 频道“组订阅中 N 个频道中的 ERROR Y 超出容量”