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

问题描述 投票:4回答:1

我在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寻找频道。

django websocket redis django-channels
1个回答
3
投票

根据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
        ...
© www.soinside.com 2019 - 2024. All rights reserved.