Как я могу отклонить и закрыть соединения в django-channels 2?

Прошел 1 месяц с тех пор, как я начал использовать django-каналы, и теперь у меня такое чувство, что я неправильно отключаю веб-сокеты. Когда я отключаюсь, я хочу полностью уничтожить группу, если там никого нет, и это не должно быть никаких признаков существования. Когда я отклоняю соединения, я поднимаю каналы.


person ArminMz    schedule 21.08.2019    source источник


Ответы (2)


Насколько я понял, закрыть группу можно с помощью group_discard.

def disconnect(self, close_code):
    async_to_sync(self.channel_layer.group_discard)("yourgroupname", self.channel_name)

Не проверив это, я бы предположил, что возбуждение исключения приведет к ошибке 500 на клиенте. И клиент, получивший ошибку, вероятно, интерпретировал бы это не как «нормально закрытый».

См. документы канала здесь: https://channels.readthedocs.io/en/latest/topics/channel_layers.html#groups

person normic    schedule 23.08.2019

Попробуйте позвонить self.close()

Из документации по каналам:

class MyConsumer(WebsocketConsumer):

    def connect(self):
        # Called on connection.
        # To accept the connection call:
        self.accept()
        # Or accept the connection and specify a chosen subprotocol.
        # A list of subprotocols specified by the connecting client
        # will be available in self.scope['subprotocols']
        self.accept("subprotocol")
        # To reject the connection, call:
        self.close()
person Anatol    schedule 14.03.2020
comment
Одна вещь, которую я заметил, это то, что если вы close перед выполнением accept, код закрытия не будет отправлен клиенту. accept нужно перед закрытием для отправки кода - мне кажется ошибкой? - person Silversonic; 12.09.2020