【问题标题】:django-channels: keeping track of users in "rooms"django-channels:跟踪“房间”中的用户
【发布时间】:2020-04-16 03:33:57
【问题描述】:

TL;DR - 如何维护每个房间中的用户列表,以便我可以将该数据发送到前端以显示该房间中的参与者列表。

我正在设计一个协作网络应用程序,它使用 django-channels 在浏览器和服务器之间进行 websocket 通信。一个房间可以由多个用户加入,并且每个用户都应该知道房间中的每个其他用户。我将如何使用 django-channels (v2) 实现这一目标?

我已经浏览了文档和一些在线可用的示例项目,但它们都没有添加类似的功能。我也知道django-channels-presence,但该项目似乎没有得到积极维护,所以我并没有真正费心研究使用它的示例。

这是我到目前为止的想法:

- 对于每个房间,我在数据库中创建一个对象,这些对象可以跟踪房间中的用户。因此,例如,在 WS 消费者的 connect() 方法中,我可以进行 get_or_create_room() 调用和 room.add_participant(self.user_name) (或从范围中获取),在 disconnect() 方法中,我可以将自己从房间中移除。然而,这个问题是我最终可能会创造竞争条件吗?我认为?此外,由于我从 ORM 中获取对象,我必须确保每次在使用该对象之前,我都必须从数据库中重新获取它,因为它可能(并且将会)很快过时。这似乎一点也不理想。

- 我能想到的另一种方法是将数据附加到消费者中的self.channel_layer,我可以在其中执行setattr(self.channel_layer, f'users_{room_id}', {}) 之类的操作,并为每个进入和离开的用户维护这个字典。这听起来又不是很安全,而且我没有看到有人使用它,所以我不确定。

对此的任何帮助将不胜感激。如果有人能指点我,我还想看看现有的应用程序是如何做到这一点的?

【问题讨论】:

    标签: django django-channels django-channels-presence


    【解决方案1】:

    所以简而言之,没有办法为群组中的成员询问频道,因此您需要:

    • 将一些信息写入数据库,并带有时间戳,以便您查看它是否旧

    • 每(n 秒)通过通道组(带有用户 ID 的机器可读项目)发送一条消息,然后您的消费者(或前端)可以维护用户列表并将其过滤到具有重新发送时间戳的用户列表。这里的缺点是检测聊天室中的所有用户可能需要几秒钟的时间。

    你不能做任何事情,比如写入一个字典或全局对象,因为这不是所有消费者共享的。

    【讨论】:

    • 你知道实现这个的任何例子吗?
    • 最后你的意思是不能*?
    • 我已经看到网上列出的任何详细说明的示例,快速了解聊天室中的用户数量对您来说很重要吗?
    • 是的。理想情况下,我想要房间中的用户列表
    • 然后使用 db 方法。创建一个数据库表 ChatRoomOcupancy,将用户映射到房间(通常是用户和房间之间的多对多表,上面有一个日期时间字段)然后每 30 秒向消费者发送一次前端消息,当消费者收到此消息时,它会更新所有该用户的 ChatRoomOcupancy 整体。然后,您可以根据具有最近数据时间的 ChatRoomOcupancy 确定谁活跃在房间中。
    猜你喜欢
    • 2020-10-06
    • 1970-01-01
    • 2012-09-13
    • 2011-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-05
    • 1970-01-01
    相关资源
    最近更新 更多