Обнаружение отключения клиента в Python / Quart с помощью веб-сокетов - PullRequest
0 голосов
/ 06 апреля 2019

У меня есть несколько клиентов, которые я храню в списке (подключен).Когда клиент (браузер) закрыт, я хочу удалить этот веб-сокет из списка подключенных веб-сокетов.

Я попробовал метод, который 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 должно быть какое-то обнаружение, что отправка на несуществующую веб-сокет происходит неправильно ... и затем удаляет ее.не исключение ...?!

я также пытался:

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

Но все же исключений не произошло ...

1 Ответ

0 голосов
/ 02 мая 2019

После обновления quart и hypercorn до 0.9 / 0.6 код работает для браузеров на ПК. (Firefox, Chrome)

Но когда я устанавливаю соединение с помощью iphone / ipad и закрываю его потом. Соединение не удалено!

Есть предложения почему?

...