使用websockets检测Python / Quart中的客户端断开连接

时间:2019-04-06 19:31:23

标签: python websocket quart

我有多个客户端,但我存储在一个列表中(已连接)。 当客户端(浏览器)关闭时,我想从连接的websocket列表中删除此websocket。

我尝试了pgjones编写的方法,做了一些改动(https://medium.com/@pgjones/websockets-in-quart-f2067788d1ee):

    def collect_websocket(func):
        @wraps(func)
        async def wrapper(*args, **kwargs):
            global connected
            data = await websocket.receive()
            data_json = json.loads(data)

            if data_json['msg_type'] == 'client_connect':
                if "id" in data_json:
                    new_client = Client(data_json['id'], False, websocket._get_current_object())
                    connected.add(new_client)
            try:
                return await func(*args, **kwargs)
            except Exception as e:
                connected.remove(websocket._get_current_object())
            finally:
                for connect in connected:
                    if connect.ws == websocket._get_current_object():
                        connected.remove(connect)
                    break
        return wrapper

.....

更多代码。...

.....

async def update_clients(self, input_survey):
        try:
            for client in connected:
                if client.survey_id == input_survey.identifier:
                    my_websock = client.ws
                    message = { ... some message...
                                }
                    message_json = json.dumps(message)
                    await my_websock.send(message_json)
        except:
            var = traceback.format_exc()
            constants.raven_client.captureException()
            self.logger.error('ERROR updating clients: {}'.format(str(var)))

在update_clients中,应该检测到不再发送到Websocket的发送出错了,然后将其删除。 但是也不例外...?!

我还试图:

try:
    await my_websock.send(message_json)
except asyncio.CancelledError:
    print('Client disconnected')
    raise

但是仍然没有例外...

1 个答案:

答案 0 :(得分:0)

在将quart和hypercorn更新为0.9 / 0.6之后,该代码适用于PC上的浏览器。 (Firefox,Chrome)

但是当我使用 iphone / ipad 建立连接并随后将其关闭时。连接没有删除!

任何建议为什么?