我需要将我的 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 握手更进一步连接套接字。
您能否提供在“/”上安装时遇到的其他问题,因为当您将其安装在“/”中时,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