FastAPI中WebSocket版本控制器的路由配置问题求助
解决FastAPI WebSocket移除无前缀路由后的403问题
核心问题分析
你当前的代码存在路径重复配置的矛盾:
- 在
__init__.py中给websocket_controller添加了prefix="/ws"前缀 - 但
websocket_controller.py里的WebSocket端点又定义了/ws/something的路径
这导致通过带前缀的路由访问时,完整路径是/ws/ws/something,而之前你实际使用的是router_without_prefix提供的/ws/something路径。移除无前缀路由后,原访问路径失效,若客户端仍请求旧路径会触发403(可能是路径匹配失败被权限中间件拦截,或直接返回权限错误)。
分步解决方案
1. 修正WebSocket端点路径
修改version->v1->websocket_controller.py中的端点定义,去掉重复的/ws前缀:
router = APIRouter() @router.websocket("/something") # 移除前面的/ws async def websocket_endpoint(websocket: WebSocket): await websocket.accept() # 你的业务逻辑代码
2. 确认最终访问路径
假设你的主应用挂载v1路由时带了/v1前缀:
from version.v1 import router as v1_router app.include_router(v1_router, prefix="/v1")
那么最终WebSocket的正确访问路径应为:ws://你的域名/v1/ws/something
3. 检查权限中间件配置
如果项目中使用了权限验证中间件(比如OAuth2、API Key校验),需要确认:
- 该中间件是否应用到了
router上,而WebSocket端点不需要权限验证 - 若需跳过验证,可在WebSocket端点上添加对应的跳过逻辑,比如自定义一个空依赖:
from fastapi import WebSocket, APIRouter, Depends # 自定义跳过权限校验的依赖 def skip_auth(): return None router = APIRouter() @router.websocket("/something") async def websocket_endpoint(websocket: WebSocket, _=Depends(skip_auth)): await websocket.accept() # 你的业务逻辑代码
4. 同步客户端访问路径
确保前端或其他客户端使用修正后的WebSocket URL,避免继续请求旧的/ws/something路径。
内容的提问来源于stack exchange,提问作者rainbow12
相关产品推荐
相关产品推荐

