Python Socket.io 处理所有事件(从客户端捕获所有事件)
Posted
技术标签:
【中文标题】Python Socket.io 处理所有事件(从客户端捕获所有事件)【英文标题】:Python Socket.io handle all events (catch all events from client) 【发布时间】:2021-03-05 20:56:24 【问题描述】:Python Socket.io 的文档在这里:https://python-socketio.readthedocs.io/en/latest/api.html#asyncserver-class
那是服务器类,带有'event'和'on'方法来处理事件。但是,这些都是命名事件。
如何在服务器端处理来自客户端的所有事件(全部捕获)?我试过.on("*",...)
但没用,星号*
似乎只是Python socket.io 中的一个字符串。
【问题讨论】:
你在使用flask_socketio吗? 是的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'
一样,它是保留的,它会捕获所有传入的消息。
【讨论】:
“消息”似乎是一个正常的事件名称【参考方案3】:似乎使用 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)')
【讨论】:
以上是关于Python Socket.io 处理所有事件(从客户端捕获所有事件)的主要内容,如果未能解决你的问题,请参考以下文章
用 Python flask_socketio 反应 socket.io-client 不处理事件