django websockets无法在频道上发送消息

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了django websockets无法在频道上发送消息相关的知识,希望对你有一定的参考价值。

我在Django上使用Redis的Web套接字。 Django在macOS服务器上正常运行,但是我开始在Redhat Linux服务器上运行它,现在每当我通过websockets发送包时,服务器都会给我这个错误:

ERROR - server - HTTP/WS send decode error:
    Cannot dispatch message on channel
    u'daphne.response.fzdRCEVZkh!nqhIpaLfWb' (unknown)

注意:当我收到错误时,将正确接收包。

我找不到任何有关此错误的资源。

我跟随official instructions寻找频道。

答案

根据Andrew Godwin(频道包的开发者)的说法,如果您有一个已断开连接但未从频道组中删除的频道,则会记录此消息:

是的,那是达芙妮比以前更冗长,我需要删除它。不要担心 - 断开仍在群组中的频道后,这是完全正常的。但是,您可能希望在断开处理程序中添加Group.discard调用以阻止它。

Source.

我有同样的错误,使用channels.generic.websockets.WebsocketConsumer的自定义impl。在disconnect回调中清除组中的通道后,消息消失了。

基于类的使用者的简短示例:假设您在连接建立时将客户端添加到名为foo的广播组。然后,在客户端断开连接时,从组中删除其通道:

from channels import Group
from channels.generic.websockets import JsonWebsocketConsumer

class MyConsumer(JsonWebsocketConsumer):

    groupname = 'foo'

    def connect(self, message, **kwargs):
        # send an accept or the connection will be dropped automatically
        self.message.reply_channel.send({"accept": True})
        # add the channel to the broadcast group
        Group(self.groupname).add(message.reply_channel)
        # do the rest of logic that should happen on connection established
        ...

    def disconnect(self, message, **kwargs):
        Group(self.groupname).discard(message.reply_channel)
        # do the rest of logic that should happen on disconnect
        ...

以上是关于django websockets无法在频道上发送消息的主要内容,如果未能解决你的问题,请参考以下文章

IOS safari 和 Chrome 阻止了我的 websocket django 频道

“发送非空 'Sec-WebSocket-Protocol' 标头但未收到响应” Django 频道

Django 频道实时聊天保存发送的消息

Django 频道,属性错误

从 Django 发送 websocket 请求

Django Channels - 当组成员时无法直接向频道发送消息