You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 12:17:51