TL;DR - 我如何维护每个房间中的用户列表,以便我可以将该数据发送到前端以显示该房间中的参与者列表。
我正在设计一个协作 Web 应用程序,它使用 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}', {})
为每个进入和离开的用户执行类似的操作并维护此字典。这听起来又不是很安全,我没有看到有人使用它,所以我不确定。
对此的任何帮助将不胜感激。如果有人能指点我,我还想看看现有的应用程序是如何做到这一点的?