Django Channels 是不是会在每次使用时创建一个新的消费者?

Posted

技术标签:

【中文标题】Django Channels 是不是会在每次使用时创建一个新的消费者?【英文标题】:Does Django Channels create a new consumer with every use?Django Channels 是否会在每次使用时创建一个新的消费者? 【发布时间】:2020-08-02 00:55:14 【问题描述】:

我有一个消费者

class BingoConsumer(WebsocketConsumer):
    logged_in = 0

    def connect(self):
        async_to_sync(self.channel_layer.group_add)(
            "login", self.channel_name
        )
        self.accept()

    def disconnect(self, close_code):
        async_to_sync(self.channel_layer.group_discard)(
            "login", self.channel_name
        )
        self.logged_in -= 1
    def receive(self, text_data):
        text_data = json.loads(text_data)
        if text_data['type'] == 'login':
            self.logged_in += 1
            async_to_sync(self.channel_layer.group_send)(
                "login", 
                    'type': 'login',
                    'count': self.logged_in,
                
            )

    def login(self, event):
        self.send(text_data=json.dumps(
            'type': 'login',
            'total': event['count'],
        ))

每次用户登录我的网站时都会调用它,它会自动调用类型为“登录”的 websocket。我想跟踪当前登录的用户数量,但是当前无论有多少人登录,它仍然是1。这让我想知道,Django是否将消费者视为单次使用类?它会根据需要创建和销毁它们吗?

【问题讨论】:

是的,确实如此。如果您想跨多个连接聚合数据,最好直接使用缓存、数据库或文件系统之类的东西来保存数据 啊,太好了,谢谢!我今天学到了一些东西:) 【参考方案1】:

变量不会在不同的会话之间共享。如果要在多个会话中计算变量,可能需要使用数据库或本地文件。

【讨论】:

以上是关于Django Channels 是不是会在每次使用时创建一个新的消费者?的主要内容,如果未能解决你的问题,请参考以下文章

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

Django Channels 2.4 ... WebSocket 消息是不是总是按顺序到达

Django Channels Consumer 未连接到 websocket

代码发布项目——django实现websocket(使用channels)基于channels实现群聊功能gojs插件paramiko模块

保存数据 Django Channels 2

Django使用Channels实现WebSocket--下篇