django - 如何为 Django 频道中的所有聊天处理单个 websocket 连接
问题描述
我想制作一个像 WhatsApp 这样的聊天应用程序,并且我想使用 Django Channels 制作后端服务器来处理所有实时更新。
我一直在探索各种来源,但我无法弄清楚如何为每个用户管理单个 websocket 连接(单个端点),并且仍然可以实时接收来自他参与的所有聊天的消息。根据我目前的理解,我可以将频道(与用户对应的网络套接字连接)添加到不同的频道组,但是如果用户是许多组的一部分(基本上有资格从各种聊天中接收更新)怎么办?我是否应该将该频道添加到所有组中,一旦建立连接,他就可以成为其中的一员,或者在我的脑海中是否有类似的解决方法:
- 将每个用户对应的频道列表存储在数据库中。
- 制作一个
for
循环,以便每当服务器接收到消息时,它都会将消息发送到与接收该消息相关的每个用户对应的 websocket 连接?
任何帮助表示赞赏。提前致谢。
解决方案
是的,对于一个简单的聊天系统,您只需将用户的频道名称添加到他订阅的群组中即可。
但是,您肯定需要在数据库中为更复杂的系统建模聊天系统。假设您有一个模型 Chat、ChatMember 和 Message。当用户连接到 websocket 时,他不需要指定任何聊天,因为它是通用连接。客户端发送的任何消息都必须指定聊天,因此您可以循环访问聊天成员并将消息转发给所有当前连接的人。
你怎么知道谁当前连接?这是棘手的部分。在我的架构中,我为每个用户设置了一个组,有点像收件箱。组名是根据用户 ID 生成的。每个用户可以有多个连接,例如移动、网络等。来自用户的所有连接都添加到用户组中,并且用户的活动连接数保存在收件箱模型中。对于新连接,它会在断开连接期间递增和递减。
所以要知道哪些聊天成员当前在线,我可以检查用户的收件箱是否至少有一个连接。如果他在线,我将消息转发到他的 ibox 组,否则我将消息存储在他的收件箱中。每当用户连接时,都会向他发送收件箱中的所有消息,并且收件箱会被清除。
这只是实现它的一种方式的示例,但您也可以考虑自定义架构或对其进行改进。
推荐阅读
- css - 如何进行背景过渡?
- wordpress - 登录验证在我的帐户页面上不起作用(wordpress)
- html - XPATH 根据上面元素中的名称返回 html 元素的内容
- python - 在 Python spyder 中未在控制台中显示输出
- qt - 为什么启动 QProcess 会冻结 QWidget 子类中的 GUI,但不会冻结 QLineEdit 子类中的 GUI?
- c# - 将数据从 C# 安全地发送到 MySQL 数据库
- django - 在模板中的django中实现倒计时
- spyder - 在 Spyder IDE 中,如何在帮助窗口中更改渲染数学方程的字体大小?
- node.js - 我可以从 jwt 键中删除除第一个和最后一个以外的所有换行符吗
- r - txt 中阅读中文时出错:corpus() 仅适用于字符、语料库、语料库、data.frame、kwic 对象