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

Posted

技术标签:

【中文标题】Django Channels - 当组成员时无法直接向频道发送消息【英文标题】:Django Channels - Unable To Message Channel Directly When A Member Of A Group 【发布时间】:2021-02-09 15:23:59 【问题描述】:

我的应用程序要求能够根据情况向单个频道和频道组发送消息。

但是,我遇到了一个问题,如果我将频道添加到群组中,我将无法再直接向他们发送消息。

这里有一些例子:

(无法发送到单个频道):

class NonWorkingExampleConsumer(WebsocketConsumer):
    def connect(self):
        self.group_name = 'group'
        async_to_sync(self.channel_layer.group_add)(
            self.group_name,
            self.channel_name
        )
        
        self.accept()
    
    def disconnect(self, close_code):
        async_to_sync(self.channel_layer.group_discard)(
            self.group_name,
            self.channel_name
        )
        
    def receive(self, text_data):
        async_to_sync(self.channel_layer.send)(
            self.channel_name,
            
                'type' : 'test',
                'message' : 'Hello World!'
            
        )
        
    def test(self, event):
        self.send(text_data=json.dumps(
            'message' : event['message']
        ))

(可以发送到单个频道):

class WorkingExampleConsumer(WebsocketConsumer):
    def connect(self):       
        self.accept()
    
    def disconnect(self, close_code):
        pass
        
    def receive(self, text_data):
        async_to_sync(self.channel_layer.send)(
            self.channel_name,
            
                'type' : 'test',
                'message' : 'Hello World!'
            
        )
        
    def test(self, event):
        self.send(text_data=json.dumps(
            'message' : event['message']
        ))

所以,我的问题是:这是一个错误还是我只是做错了什么?我正在考虑在 Django Channels GitHub 上开一张票,但它建议先检查 *** 以确保它绝对是一个错误而不是用户错误(这是一个真正的可能性!)

我正在使用 Django 3.1 版、Django Channels 3.0.2 版和 Django Channels Redis 3.2.0 版。这是我的 Redis 设置:

CHANNEL_LAYERS = 
    'default': 
        'BACKEND': 'channels_redis.core.RedisChannelLayer',
        'CONFIG': 
            "hosts": [('192.168.15.82', 6379)],
        ,
    ,

非常感谢任何帮助。

【问题讨论】:

您希望对方向自己发送消息吗?因为这就是您当前的代码正在尝试做的事情。如果你想要这样,那么真的不需要通过通道层发送。您可以直接在receive 方法中调用self.send。鉴于self.channel_name 是发送者的频道,代码只是将消息发送回发送者 我已经大大简化了我的代码,只是为了举例说明这个问题。我的应用程序中实际发生的情况是,我有几个不同的处理程序函数根据从客户端接收的数据执行不同的工作。这些函数有的只需要返回数据给同一个用户,有的需要返回数据top ALL用户。所以在我的情况下,我需要使用 send 和 group_send 的组合,但如前所述,一旦将频道添加到组中,前者似乎不再起作用。 您好@Ken4scholars 和 Dan Alderman:希望您能对我的问题提出想法。类似的问题,但它并没有真正消失。 ***.com/questions/68172488/… 【参考方案1】:

我不完全确定为什么,但经过一夜睡眠和一些修改我的代码后,现在似乎可以按预期工作了。

这确实回答了问题,一直是用户错误!

很抱歉浪费您的时间,但非常感谢您尝试解决问题。

【讨论】:

以上是关于Django Channels - 当组成员时无法直接向频道发送消息的主要内容,如果未能解决你的问题,请参考以下文章

Django Channels - 未执行连接

如何使用 Django Channels 3.0.0 向所有消费者发送消息?

Django - Celery Worker - 频道

无法使用 Django channels_redis 与 Heroku Redis 建立连接

使用Django Channels 2上传文件

引入 Django Channels 时是不是需要更改我的正常 Django 代码?