每个用户只保留一个活动连接

Posted

技术标签:

【中文标题】每个用户只保留一个活动连接【英文标题】:Leave only one active connection per user 【发布时间】:2017-01-22 17:05:40 【问题描述】:

在 Django 1.10.5 和 Channels 1.0.2 中使用 websocket。我正在使用用户令牌打开连接,并且我希望打开连接断开使用该用户 ID 的每个人。然而,即使在接受连接之前运行的命令也会关闭用户自己。

我是这样做的:

def get_group(user):
    if isinstance(user, User):
        uuid = str(user.uuid)
        return Group('user-%s' % uuid)

@channel_session
def websocket_connect(message):
    user = CachedOAuth2Authentication().authenticate(socket_messeger=message)
    if user:
        # Do not use more than one device.
        get_group(user).send("close": True)

        message.channel_session['user'] = user

        get_group(user).add(message.reply_channel)
        message.reply_channel.send("accept": True)
    else:
        message.reply_channel.send("close": True)

【问题讨论】:

【参考方案1】:

我找到了解决办法:

对于群组,“send”方法中有“immediately = False”参数,保持为true,然后函数会在添加新用户之前执行,所以不会断开新连接。

  def send(self, content, immediately=False):
        """
        Send a message to all channels in the group.

        Sends are delayed until consumer completion. To override this, you
        may pass immediately=True.
        """

【讨论】:

【参考方案2】:

请参阅有关接受连接的信息:Websocket using Django Channels

关于每个用户只有一个连接,您必须根据您的逻辑拒绝新连接或在 websocket.connect 上发送关闭消息到相关的回复通道(或通道),这似乎是您的正在这里尝试。

【讨论】:

以上是关于每个用户只保留一个活动连接的主要内容,如果未能解决你的问题,请参考以下文章

DM_EXEC_SESSIONS 未返回活动连接

Django基础---web框架 和 django 介绍

MySQL - 两个表和两个连接

根据每个 pod 的活动连接数扩展 GKE pod

如何将每个用户的最后一条消息显示给用户对话以保留聊天记录?

保留 XMPP 连接