【问题标题】:django channels won't disconnectdjango 频道不会断开连接
【发布时间】:2019-04-25 23:36:06
【问题描述】:

我正在使用通道对数据库进行长轮询,因此我使用的是AsyncConsumer。当网页关闭或手动刷新时,我无法运行断开连接方法。我尝试过创建;

  • def disconnect(self, close_code)
  • def ws_disconnect(self, close_code)
  • def websocket_disconnect(self, close_code)

我已经在前面使用和不使用异步进行了尝试。我也试过用'event'替换参数。
当我第一次编写方法时,我包含了channels.exceptions.StopConsumer(),但是当它不起作用时,我在我的 disconnect 方法中放置了一个 print 语句,只是为了测试,并且似乎断开方法永远不会触发。

抱歉,如果这是一个愚蠢的问题,但我已经花了 3 天时间尝试了我在互联网上可以找到的所有内容。当我关闭或刷新页面时,终端显示

'WebSocket DISCONNECT /page_name/ [127.0.0.1:35748]

然后几秒钟后有一条消息指出

 'Application instance <Task pending coro=<__call__() running at /home/ecl/.local/lib/python3.5/site-packages/channels/sessions.py:179> wait_for=<Future pending cb=[Task._wakeup()]>> for connection <WebSocketProtocol client=['127.0.0.1', 35746] path=b'/alertstatus/'> took too long to shut down and was killed.'

如果有人可以就在哪里寻找解决方案给我任何建议,我将不胜感激。

【问题讨论】:

    标签: django django-channels


    【解决方案1】:

    你应该提出 StopConsumer()。

    我的例子:

    from channels.exceptions import StopConsumer
    
    ...
    
    async def websocket_disconnect(self, event):
        # Leave room group
        await self.channel_layer.group_discard(
            self.room_name,
            self.channel_name
        )
        raise StopConsumer()
    

    这对我有用。

    【讨论】:

    • 很可能您根本不需要覆盖websocket_disconnect - 内置版本包括raise StopConsumer()。坚持覆盖disconnect
    猜你喜欢
    • 2018-11-23
    • 1970-01-01
    • 1970-01-01
    • 2019-05-31
    • 2012-11-30
    • 2021-03-07
    • 2022-12-11
    • 1970-01-01
    • 2019-05-28
    相关资源
    最近更新 更多