如何让FastAPI依赖项填充路径参数?解决双路由共用函数422错误
解决FastAPI双路由共用函数的参数注入问题
你碰到的422错误根源在于:/inbound路由的test函数需要wako_id参数,但该路由既没提供路径/查询参数,也没把依赖的结果注入到函数里——原来的dependencies参数仅执行依赖函数,不会将返回值传递给视图函数,因此FastAPI无法找到wako_id的取值来源,抛出参数缺失的错误。
下面提供两种可行的解决方案:
方案一:直接让参数绑定依赖生成值
将wako_id参数的默认值设置为依赖函数的返回结果,这样/inbound路由会使用依赖生成的值,/outbound/{wako_id}路由则会优先使用路径参数的值(路径参数会覆盖默认的依赖注入值):
from fastapi import Depends, Request, APIRouter authorized_router = APIRouter() # 调整依赖函数,直接返回wako_id的值 def get_wako_id(): return "123" def test(request: Request, wako_id: str = Depends(get_wako_id)): return wako_id authorized_router.add_api_route( "/inbound", test, methods=["GET"] ) authorized_router.add_api_route( "/outbound/{wako_id}", test, methods=["GET"] )
方案二:兼容依赖返回字典的场景
如果你的依赖函数必须返回包含多个字段的字典,可以通过同时接收依赖结果和可选路径参数的方式处理:
from fastapi import Depends, Request, APIRouter from typing import Optional authorized_router = APIRouter() def middleware(): return {"wako_id": "123"} def test(request: Request, wako_data: dict = Depends(middleware), wako_id: Optional[str] = None): # 优先使用路径参数的值,无参数时使用依赖生成的值 return wako_id or wako_data["wako_id"] authorized_router.add_api_route( "/inbound", test, methods=["GET"] ) authorized_router.add_api_route( "/outbound/{wako_id}", test, methods=["GET"] )
两种方案都能实现需求:/inbound路由会返回依赖生成的123,/outbound/456这类请求会返回路径中的456。
内容的提问来源于stack exchange,提问作者P.Bjur
相关产品推荐
相关产品推荐

