#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. Теперь я понял. Большое вам спасибо за помощь.