Python Socket.io handle all events (catch all events from client)

Python Socket.io handle all events (catch all events from client)

Python Socket.io 的文档在这里:https://python-socketio.readthedocs.io/en/latest/api.html#asyncserver-class

即服务器class,用'event'和'on'方法处理事件。但是,这些是命名事件。

如何在服务器端处理来自客户端的所有事件(catch all)?我已经尝试 .on("*",...) 但它没有用,星号 * 似乎只是 Python socket.io.

中的一个字符串

文档中似乎没有明确说明,但您可以监听 'message' 事件。与 'connect''disconnect' 一样,它是保留的,它会捕获所有传入的消息。

您可以使用 AsyncNamespace class 覆盖 trigger_event 方法。

Dispatch an event to the proper handler method.

In the most common usage, this method is not overloaded by subclasses, as it performs the routing of events to methods. However, this method can be overridden if special dispatching rules are needed, or if having a single method that catches all events is desired.

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())

似乎 flask_socketio 捕获所有未注册事件的 on("*") 事件处理程序不起作用。

我不知道它是否会破坏任何东西,但解决方法是访问 python-socketio 服务器对象本身,然后使用 on("*"),例如:

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