Как корректно обрабатывать автоматическое отключение Daphne websockets

#django #django-channels #daphne

#django #django-каналы #дафна

Вопрос:

У Daphne есть --websocket_timeout ссылка на параметр. Как упоминалось в документе,

 --websocket_timeout WEBSOCKET_TIMEOUT
                 
Maximum time to allow a websocket to be connected. -1 for infinite.
 

Сокет отключен, и дальнейшая связь невозможна. Однако клиент не получает событие отключения, следовательно, не может обработать его корректно. Как мой клиент узнает, отключен сокет или нет?? Я не хочу сохранять (на клиенте) таймер и не хочу его перепроверять.

Вот как я развертываю свое приложение

daphne -b 0.0.0.0 -p 8000 --websocket_timeout 1800 app.asgi:application

Сокет автоматически отключается через каждые 30 минут, но клиент никогда не узнает об этом.

Как правильно поступить с этим,.??

Обновить

Попытка отправить событие до закрытия соединения. Я перегружаю свой websocket_disconnect обработчик, который отправляет json перед отключением. Однако он не отправляет событие.

 class Consumer(AsyncJsonWebsocketConsumer):
    async def websocket_disconnect(self, message):
            """Over-riding."""
            print('Inside websocket_disconnect consumer')
            await self.send_json(
                "event": "disconnecting..."
            )
            await super().websocket_disconnect(message)
 

Ответ №1:

Я не уверен, что это проблема, которая нуждается в решении. Клиент уверен, что после X минут бездействия он будет отключен, где X определяется сервером. У него нет уверенности, что это не произойдет до этого. Итак, вам нужен код для обработки подключения независимо.


Хотя кажется грязным поддерживать соединение на холостом ходу, я не могу себе представить, что это стоит больших ресурсов.

Ваше предположение, что клиент не узнает об этом, неверно. Когда вы регистрируете обработчик onclose, клиент получает событие отключения и может действовать соответствующим образом.

Комментарии:

1. Клиент действительно получает событие при отправке приложения python return self.send({'close': True}) . Однако событие не получено, когда daphne автоматически отключается через 30 минут, установленных via --websocket_timeout 1800 .

2. Я только что протестировал его с этим параметром, установленным на 30 секунд и 5 секунд, потому что, ну, я стал нетерпеливым :). Работает так, как рекламируется. Но я использую Daphne 2.5.0 (не удосужился разобраться с проблемами BC).

3. Могу ли я отправить событие перед отключением?? Обновляя мой код, пожалуйста, посмотрите.

4. Вы все еще предполагаете, что что-то отправлено. Я только что сделал kill -KILL 9775 , где 9775 — это pid daphne. Это означает, что daphne не может отправить ничего, даже если захочет, поскольку KILL внезапно завершается. И событие onclose () сработало. Так что, возможно, это браузер. Я использую последнюю версию firefox на Mac.

5. Теперь я понял. Большое вам спасибо за помощь.