python - 生产聊天应用程序上的 Websocket :

标签 python django websocket django-channels

当我开始使用 Python(本例中为 Django Channels)开发网络套接字时,我开始想知道公司如何扩展聊天应用程序。

考虑这个具体问题: 用户 A 有一个他们参与的“群组消息”列表。用户 A 能够接收来自每个群组的通知。假设用户 A 有 5 个不同的组,他想要实时通知。

  1. 用户 A 是否有 5 个独立的 Web 套接字连接?这是最简单的,但也是最庞大的,而且肯定无法扩展(如果每个用户有 20 个聊天会怎样)。创建一个 Django Channels“组”来监听特定人群并向其发送通知是非常容易的。

  2. 用户 A 是否有 1 个 Web 套接字连接来获取来自许多不同位置的所有通知?如果是,用户 A 在后端订阅了什么?在 Django Channels 中,当用户订阅“组”时会创建一个 websocket。如果我们希望每个“组”有一个用户,这似乎违反直觉。在这种情况下,用户 A 正在订阅他们自己的个人“组”,而其他后端服务则根据其他逻辑向该特定“组”传递消息,即当使用该服务的任何用户收到消息时实现。

这非常冗长且文本量很大,但它描绘了一个有趣的问题,这个问题过去已经为其他公司所困扰。我很感激任何信息或见解!

(这是我认为基本相同的问题列表(忽略语言和库的使用)) 1.Websocket multiple Channels vs. One Channel + Server Side handling [GroupChat]

最佳答案

首先创建一个轮廓模型:

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, verbose_name=_("user"))
    channel = models.CharField(unique=True, max_length=255, blank=True, null=True, verbose_name=_("channel")) # channel for notify user

然后创建消息模型:

class Message(models.Model):
    to_user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name=_("user"))
    from_user = models.ForeignKey(User)
    text = models.TextField(blank=True, null=True)

然后使用 Django 信号发送通知:

@receiver(post_save, sender=Message)
def send_notify(instance, created, **kwargs):
    if created:
        Group('chat-{}'.format(instance.to_user.profile.channel)).send({'text': {'message': 'you have a new message'}})

对不起我的英语:))

关于python - 生产聊天应用程序上的 Websocket :,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47725308/

相关文章:

ios - 将 socket.io 集成到 REST API 中

javascript - Websocket服务器打印对象Object而不是字符串

python - Tensorflow OMP : Error #15 when training

python - 如何在 Windows 上使用 EIGEN 安装 opencv-contrib-python?

python - sys._current_frames() 中的孤立堆栈跟踪

django - 连接 django 注册信号

python - 需要使用 python(selenium) 抓取通过 ajax 加载的表

python - 覆盖 ModelForm 中的初始值

Python feedparser 无法读取 WordPress 自定义提要

java - apache tomcat 8 websocket来源和客户端地址