未处理 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的主要内容,如果未能解决你的问题,请参考以下文章