#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})')