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

时间:2017-01-22 17:05:41

标签: django python-3.x websocket django-channels

使用带有Django 1.10.5的websocket和Channels 1.0.2。我正在打开与用户令牌的连接,我希望这个开头可以断开所有使用该用户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})

2 个答案:

答案 0 :(得分:1)

我找到了解决方案:

对于组,在“send”方法中有“immediate = False”参数,只需将其保留为true,然后在添加新用户之前执行该函数,因此不会断开新连接。 / p>

  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.
        """

答案 1 :(得分:0)

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

关于每个用户只有连接,您必须根据您的逻辑拒绝新连接,或者在websocket.connect上发送关闭消息到相关的reply_channel(或多个频道),这似乎是你想在这里做什么。