Сокет Python.io обрабатывает все события (перехватывать все события от клиента)

#python #web #socket.io #event-handling #catch-all

#python #веб #socket.io #обработка событий #catch-all

Вопрос:

Документация для сокета Python.ввод-вывод здесь: https://python-socketio.readthedocs.io/en/latest/api.html#asyncserver-class

Это класс сервера с методами ‘event’ и ‘on’ для обработки событий. Однако это именованные события.

Как обрабатывать все события от клиента (перехватывать все) на стороне сервера? Я пробовал .on("*",...) , но это не сработало, звездочка * кажется просто строкой в Python socket.io .

Комментарии:

1. Вы случайно не используете flask_socketio?

2. да, flask_socketio

Ответ №1:

Вы можете использовать AsyncNamespace class для переопределения метода trigger_event .

Отправить событие в соответствующий метод обработчика.

В наиболее распространенном использовании этот метод не перегружен подклассами, поскольку он выполняет маршрутизацию событий в методы. Однако этот метод может быть переопределен, если требуются специальные правила диспетчеризации или если требуется иметь один метод, который перехватывает все события.

 class MyCustomNamespace(socketio.AsyncNamespace):
    async def trigger_event(self, event_name, sid, *args):
        print(f"{event_name=}, {sid=}")
        if args:
            print(f"data is {args[0]}")


sio.register_namespace(MyCustomNamespace())
 

Ответ №2:

Похоже, этого нет в документах явно, но вы можете прослушивать 'message' события. Нравится 'connect' , и 'disconnect' он зарезервирован, и он перехватывает все входящие сообщения.

Комментарии:

1. кажется, «сообщение» — это обычное имя события

Ответ №3:

Похоже, что с помощью on("*") flask_socketio обработчик событий для перехвата всех незарегистрированных событий не работает.

Я понятия не имею, нарушает ли это что-нибудь, но обходным путем является доступ к самому объекту сервера python-socketio, а затем использовать on("*") , как:

 @sio.server.on('*')
def catch_all(event, sid, *args):
    print(f'catch_all(event={event}, sid={sid}, args={args})')