首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >不调用Django通道WebSocketConsumer的断开()方法

不调用Django通道WebSocketConsumer的断开()方法
EN

Stack Overflow用户
提问于 2020-07-11 09:00:14
回答 2查看 2.2K关注 0票数 0

我有以下类,它是从WebSocketConsumer继承的:

代码语言:javascript
复制
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的参数。我正在用一个铬插件测试这段代码。当我打开连接并在不发送任何消息的情况下关闭它时,断开连接方法将按预期执行。例如,当数字为100,而接收方法中的循环尚未完成,而我在两者之间断开连接时,将不调用disconnect方法,并得到以下错误:

代码语言:javascript
复制
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

的同步性质?

EN

Stack Overflow用户

发布于 2020-07-11 09:36:51

当用户连接关闭并继续向it发送数据时,通道将引发异常,请使用try ... except... block

代码语言:javascript
复制
def receive(self, text_data=None, bytes_data=None):
    data = json.loads(text_data)
    n = data["number"]
          
    try:
        for i in range(n):
            self.send(json.dumps({"number":i}))
    except Exception as e:# i don't remember exact exception, will change this soon
        print(e) #you can log this situation or do what ever you want
票数 0
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62847184

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档