Оставьте только одно активное соединение для каждого пользователя

Использование веб-сокета с Django 1.10.5 с каналами 1.0.2. Я открываю соединение с токеном пользователя, и я хотел бы, чтобы открытие отключило всех, кто использует этот идентификатор пользователя. Однако команда, даже запущенная до принятия соединения, в конечном итоге закрывает самого пользователя.

Вот как я это сделал:

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

person Luís De Marchi    schedule 22.01.2017    source источник


Ответы (2)


Я нашел решение:

Для групп в методе "отправить" есть параметр "немедленно = False", просто оставьте его истинным и тогда функция будет выполняться перед добавлением нового пользователя, поэтому не разрывает новое соединение.

  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.
        """
person Luís De Marchi    schedule 02.02.2017

см. это о принятии соединений: Websocket с использованием каналов Django

О том, что у каждого пользователя есть только одно соединение, вам придется либо отклонить новые соединения на основе вашей логики, либо отправить сообщение о закрытии через websocket.connect на соответствующий ответ_канал (или каналы), что, кажется, это то, что вы пытаетесь делай здесь.

person tovmeod    schedule 25.01.2017