将SocketIO挂载到FastAPI

问题描述 投票:0回答:1

我需要将我的 SocketIO 服务器挂载到 /socket.io 上的 FastAPI 应用程序,但是当我尝试使用它时,它显示 404 并且找不到路由。

def handle_connect(sid, environ):
    print(f"socket connected with sid {sid}")

class socketmanager:
    def __init__(self):
        self.server = socketio.AsyncServer(
            cors_allowed_origins=["http://localhost:30000", "http://localhost:40000"],
            async_mode="asgi",
            logger=True,
            engineio_logger=True,
        )
        self.app = socketio.ASGIApp(self.server)

    @property
    def on(self):
        return self.server.on

    @property
    def send(self):
        return self.server.send

    def mount_to(self, path: str, app):
        app.mount(path, self.app)


if __name__ == "__main__":
    socket_manager = socketmanager()
    socket_manager.on("connect", handler=handle_connect)

    app = FastAPI()
    socket_manager.mount_to("/socket.io", app)
    uvicorn.run(app, host="localhost", port=40000)

    @app.get("/")
    def index():
        return "response"

这是我的服务器如何工作的最小示例。 如何在 /socket.io 上使用 FastAPI 挂载而不破坏整个路由?

我尝试安装在“/”上,这工作正常,但我不可更改的前端不会比 HTTP 握手更进一步连接套接字。

python socket.io fastapi
1个回答
0
投票

您能否提供在“/”上安装时遇到的其他问题,因为当您将其安装在“/”中时,Socket io 的默认配置会为长轮询传输添加 /socket.io 路由。当您将其安装在“/”以外的位置(如“/socket.io”)时,应用程序会将另一个长轮询注册为子路由,我们可以看到它,如“/socket.io/socket.io”,即当您的客户端应用程序找到时'/socket.io' 上的长轮询路线不是按照路线进行的传输。这解释了404路由未找到。

您需要设定的路线

/

路由socket.io在“/”之后自动注册长轮询

/socket.io

您注册的路线

/socket.io

路由socket.io在'/socket.io'之后自动注册长轮询

/socket.io/socket.io

路由您的客户端应用程序在手动路由“/socket.io”后寻找长轮询

/socket.io

路由它应该关注您从“/”到“/socket.io”的更改

/socket.io/socket.io
© www.soinside.com 2019 - 2024. All rights reserved.