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

Leave only one active connection per user

在 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})

查看有关接受连接的信息:

关于每个用户只有一个连接,您必须根据您的逻辑拒绝新连接,或者在 websocket.connect 时向相关 reply_channel(或频道)发送关闭消息,这似乎就是您要在此处执行的操作。

我找到了解决方案:

对于群组,在"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.
        """