首页 > 解决方案 > 如何为 Django 频道中的所有聊天处理单个 websocket 连接

问题描述

我想制作一个像 WhatsApp 这样的聊天应用程序,并且我想使用 Django Channels 制作后端服务器来处理所有实时更新。

我一直在探索各种来源,但我无法弄清楚如何为每个用户管理单个 websocket 连接(单个端点),并且仍然可以实时接收来自他参与的所有聊天的消息。根据我目前的理解,我可以将频道(与用户对应的网络套接字连接)添加到不同的频道组,但是如果用户是许多组的一部分(基本上有资格从各种聊天中接收更新)怎么办?我是否应该将该频道添加到所有组中,一旦建立连接,他就可以成为其中的一员,或者在我的脑海中是否有类似的解决方法:

  1. 将每个用户对应的频道列表存储在数据库中。
  2. 制作一个for循环,以便每当服务器接收到消息时,它都会将消息发送到与接收该消息相关的每个用户对应的 websocket 连接?

任何帮助表示赞赏。提前致谢。

标签: djangowebsocketdjango-channels

解决方案


是的,对于一个简单的聊天系统,您只需将用户的频道名称添加到他订阅的群组中即可。

但是,您肯定需要在数据库中为更复杂的系统建模聊天系统。假设您有一个模型 Chat、ChatMember 和 Message。当用户连接到 websocket 时,他不需要指定任何聊天,因为它是通用连接。客户端发送的任何消息都必须指定聊天,因此您可以循环访问聊天成员并将消息转发给所有当前连接的人。

你怎么知道谁当前连接?这是棘手的部分。在我的架构中,我为每个用户设置了一个组,有点像收件箱。组名是根据用户 ID 生成的。每个用户可以有多个连接,例如移动、网络等。来自用户的所有连接都添加到用户组中,并且用户的活动连接数保存在收件箱模型中。对于新连接,它会在断开连接期间递增和递减。

所以要知道哪些聊天成员当前在线,我可以检查用户的收件箱是否至少有一个连接。如果他在线,我将消息转发到他的 ibox 组,否则我将消息存储在他的收件箱中。每当用户连接时,都会向他发送收件箱中的所有消息,并且收件箱会被清除。

这只是实现它的一种方式的示例,但您也可以考虑自定义架构或对其进行改进。


推荐阅读