Python socketio 在连接启动后添加命名空间

Python socketio add namespace after a connection is started

查看 python socketio 文档,我定义了一个自定义命名空间:

import socketio


class MyCustomNamespace(socketio.ClientNamespace):

    def on_connect(self):
        pass

    def on_disconnect(self):
        pass

    def on_my_event(self, data):
        self.emit('my_response', data)

sio = socketio.Client()
sio.register_namespace(MyCustomNamespace('/chat'))
sio.connect("http://127.0.0.1:8888")
sio.emit("get", namespace="/chat")

现在只要我在注册命名空间后启动连接,这个命名空间就可以工作了。说得通。 但是有没有办法在连接开始后注册命名空间呢?我收到以下错误:

  File "//src/pipeline/reporting/iam.py", line 30, in request_iam_credentials
    self.socket_client.emit(
  File "/usr/local/lib/python3.8/dist-packages/socketio/client.py", line 393, in emit
    raise exceptions.BadNamespaceError(
socketio.exceptions.BadNamespaceError: /chat is not a connected namespace.

每个名字space有点不同space你必须连接。如果您不明确使用名称 space,则默认为“/”。看:

sio = socketio.Client()
sio.emit("get") # emit before connect

# socketio.exceptions.BadNamespaceError: / is not a connected namespace.

你的情况是一样的,但是使用 /chat namespace - 你连接到 / 但尝试发送到 /chat。您需要自己连接到 /chat namespace:

sio.connect("http://127.0.0.1:8888", namespaces=["/chat"]) # notice you can connect to more namespaces at once

这正是 sio.connect 在您之前注册名称space 时所做的。