Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 如何优雅地处理Daphne websockets的自动断开_Django_Django Channels_Daphne - Fatal编程技术网

Django 如何优雅地处理Daphne websockets的自动断开

Django 如何优雅地处理Daphne websockets的自动断开,django,django-channels,daphne,Django,Django Channels,Daphne,Daphne有一个参数--websocket\u timeout。如文件所述 --websocket_timeout WEBSOCKET_TIMEOUT Maximum time to allow a websocket to be connected. -1 for infinite. 插座已断开,无法进行进一步通信。但是,客户端没有收到断开连接事件,因此无法正常处理它。我的客户如何知道套接字是否已断开连接??我不想(在客户机上)保留一个计时器,也不想继续

Daphne有一个参数--websocket\u timeout。如文件所述

--websocket_timeout WEBSOCKET_TIMEOUT
                 
Maximum time to allow a websocket to be connected. -1 for infinite.
插座已断开,无法进行进一步通信。但是,客户端没有收到断开连接事件,因此无法正常处理它。我的客户如何知道套接字是否已断开连接??我不想(在客户机上)保留一个计时器,也不想继续重新检查它

这就是我部署应用程序的方式

daphne-b0.0.0-p8000-websocket\u超时1800应用程序。asgi:application

套接字每30分钟自动断开一次连接,但客户端永远不会知道这一点

正确的方法是什么

更新

正在尝试在连接关闭之前发送事件。我的
websocket\u 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)
我不确定这是一个需要解决的问题。客户端可以确定,在X分钟不活动后,它将断开连接,其中X由服务器确定。在那之前它不确定不会发生。因此,不管怎样,您都需要连接处理代码

虽然保持一个空闲的连接看起来很肮脏,但我无法想象它会耗费大量资源


你认为客户不知道这件事的前提是错误的。注册onclose处理程序时,客户端会收到一个断开连接事件,并可以相应地执行操作。

当python应用程序发送
返回self.send({'close':True})时,客户端确实会收到该事件。
。然而,当daphne通过
--websocket_timeout 1800
设置30分钟后自动断开连接时,没有收到任何事件。我只是将该设置设置为30秒和5秒进行了测试,因为我不耐烦了:)。像广告宣传的那样工作。但我使用的是Daphne 2.5.0(还没有时间处理BC问题)。我可以在断开连接之前发送事件吗??更新我的代码,请看一看。你仍然假设有东西被发送。我刚刚做了一个
kill-kill 9775
,其中9775是达芙妮的pid。这意味着达芙妮不能发送任何它想发送的东西,因为KILL会突然终止。并触发onclose()事件。所以可能是浏览器。我正在Mac电脑上使用最新的firefox。我现在明白了。非常感谢你的帮助。