У меня есть следующий класс, который наследуется от WebSocketConsumer
:
from channels.generic.websocket import WebsocketConsumer
from channels.exceptions import StopConsumer
class MyConsumer(WebsocketConsumer):
def connect(self):
self.accept()
def receive(self, text_data=None, bytes_data=None):
data = json.loads(text_data)
n = data["number"]
for i in range(n):
self.send(json.dumps({"number":i}))
def disconnect():
raise StopConsumer
Вход JSON содержит только один параметр с именем number
. Я тестирую этот код с помощью плагина chrome. Когда я открываю соединение и закрываю его без отправки сообщения, метод отключения выполняется должным образом.
Когда число, например, 100, а l oop внутри метода приема еще не завершено, и я отключаюсь между ними, метод отключения не вызывается, и я получаю следующую ошибку:
ERROR - server - Exception inside application: Attempt to send on a closed protocol.
File "MyConsumer.py", line 2, in receive
self.send
File "python3.6/site-packages/channels/generic/websocket.py", line 69, in send
{"type": "websocket.send", "text": text_data},
File "python3.6/site-packages/channels/consumer.py", line 107, in send
self.base_send(message)
File "python3.6/site-packages/asgiref/sync.py", line 64, in __call__
return call_result.result()
File "/usr/local/var/pyenv/versions/3.6.10/lib/python3.6/concurrent/futures/_base.py", line 432, in result
return self.__get_result()
File "/usr/local/var/pyenv/versions/3.6.10/lib/python3.6/concurrent/futures/_base.py", line 384, in __get_result
raise self._exception
File "python3.6/site-packages/asgiref/sync.py", line 78, in main_wrap
result = await self.awaitable(*args, **kwargs)
File "python3.6/site-packages/channels/sessions.py", line 220, in send
return await self.real_send(message)
File "python3.6/site-packages/daphne/server.py", line 198, in handle_reply
protocol.handle_reply(message)
File "python3.6/site-packages/daphne/ws_protocol.py", line 179, in handle_reply
self.serverSend(message["text"], False)
File "site-packages/daphne/ws_protocol.py", line 223, in serverSend
self.sendMessage(content.encode("utf8"), binary)
File "python3.6/site-packages/autobahn/websocket/protocol.py", line 2216, in sendMessage
raise Disconnected("Attempt to send on a closed protocol")
Attempt to send on a closed protocol
Я хочу иметь возможность отключиться даже при обработке для данный номер не был заполнен. Это невозможно с WebSocketConsumer
? Я неправильно понял синхронный характер WebSocketConsumer
?