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

How to gracefully handle auto disconnect of Daphne websockets

达芙妮有参数--websocket_timeoutlink。如文档中所述,

--websocket_timeout WEBSOCKET_TIMEOUT
                 
Maximum time to allow a websocket to be connected. -1 for infinite.

套接字已断开连接,无法进行进一步的通信。但是,客户端不会收到断开连接事件,因此无法正常处理。我的客户如何知道套接字是否断开连接?我不想(在客户端)保留一个计时器,也不想继续重新检查它。

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

daphne -b 0.0.0.0 -p 8000 --websocket_timeout 1800 app.asgi:application

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

正确的做法是什么??

更新

试图在连接关闭前发送一个事件。我正在覆盖我的 websocket_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 处理程序时,客户端会收到一个断开连接事件并可以相应地采取行动。