В целом эта ошибка возникает из-за того, что сопрограмма висит дольше, чем должна.
Это указывает c case
В этом случае AsyncWebsocketConsumer.websocket_disconnect()
переопределяется, но не вызывает super()
, что означает, что StopConsumer()
не запускается (см. channels / generic / websocket.py: 228 ). Возможно, вообще не отменяйте websocket_disconnect
, поскольку в этом примере нет ничего, что могло бы его оправдать.
Также обратите внимание, что async_to_sync
предназначен для потребителей syn c, но это асинхронный c потребитель. Вместо этого используйте:
await self.channel_layer.group_discard(
self.room_group_name,
self.channel
)
await self.close()
не требуется, поскольку отключение уже произошло. Удалите эту строку.
AsyncHttpConsumer
Точно так же в AsyncHttpConsumer
я часто совершаю ошибку, когда звоню await self.send_response(...)
, но потом забываю позвонить return
впоследствии, поэтому функция продолжит работу, когда вы этого не ожидали.
AsyncHttpConsumer
также имеет открытый отчет об ошибке о том, что исключения не появляются внутри handle()
. Единственный вариант в настоящее время - добавить дополнительные строки печати / регистрации, чтобы выяснить, что работает / не работает.
Остерегайтесь django -debug-toolbar
Также стоит отметить, что добавление debug-toolbar
к INSTALLED_APPS
отключит исключения в ваших асинхронных c потребителях. См. Обсуждение здесь . Осторожно!