fastapi 不支持直接用依赖项覆盖路径参数,但可通过 `optional[str]` 参数 + 请求路径判断实现统一处理逻辑:对 `/outbound/{wako_id}` 自动提取路径值,对 `/inbound` 则由依赖项提供默认 id。
在 FastAPI 中,路径参数(如 /outbound/{wako_id})是强制性的,无法设为可选;而依赖项(Depends)本身不能“注入”到路径参数占位符中——它只能作为函数参数被解析。因此,若希望同一处理函数既能接收显式路径参数、又能由依赖项提供默认值,关键在于解耦参数来源:将 wako_id 声明为可选依赖参数,并在依赖函数内根据当前请求的实际路径动态决定其值。
以下是一个健壮、可复用的实现方案:
from fastapi import FastAPI, Request, Depends, APIRouter
from typing import Optional
app = FastAPI()
router = APIRouter()
def get_wako_id(request: Request, wako_id: Optional[str] = None) -> str:
"""
统一获取 wako_id 的依赖函数:
- 若请求路径为 '/outbound/{wako_id}' 且路径中已匹配到 wako_id,则返回该值;
- 若请求路径为 '/inbound',则返回硬编码默认值 '123';
- 其他路径将触发 400 错误(可按需调整)。
"""
# 获取当前路由的原始路径模板(含 {param} 占位符)
route_path = request.scope.get("route", {}).get("path", "")
if route_path == "/outbound/{wako_id}" and wako_id is not None:
return wako_id
elif route_path == "/inbound":
return "123"
else:
from fastapi import HTTPEx
ception
raise HTTPException(
status_code=400,
detail=f"Unsupported route or missing wako_id: {route_path}"
)
@router.get("/inbound")
@router.get("/outbound/{wako_id}")
def handle_request(wako_id: str = Depends(get_wako_id)):
return {"wako_id": wako_id}
app.include_router(router)✅ 关键要点说明:
? 进阶提示:
如需支持更多路由或动态默认值(如从数据库/配置加载),可将默认 ID 提取为依赖参数(例如 default_id: str = Depends(get_default_id)),进一步提升可测试性与可维护性。