2017-01-22 2 views
1

Использование websocket с 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}) 

ответ

1

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

Для групп, в методе «отправить» есть «непосредственно = 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. 
     """ 
0

видеть это о принятии соединений: Websocket using Django Channels

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

Смежные вопросы