FastAPI中如何为依赖函数传参且避免被识别为查询参数
解决FastAPI依赖函数传固定内部参数的问题
问题根源:你之前用lambda作为Depends参数的写法里,lambda的request参数没有类型标注,FastAPI无法识别这是需要注入的Request对象,反而把lambda的参数当成了路由的查询参数,导致"some-argument"被错误解析成查询参数。
下面是几种可行的正确传参方式:
方案1:闭包包装依赖函数
通过外层函数接收固定参数,返回的内层函数专门处理Request注入并调用目标依赖:
from fastapi import Depends, Request, JSONResponse from fastapi.routing import APIRouter some_router = APIRouter() async def do_something(request: Request, value: str): pass def get_do_something(value: str): async def wrapper(request: Request): return await do_something(request, value) return wrapper @some_router.post("/some-route") async def handleRoute(something = Depends(get_do_something("some-argument"))): return JSONResponse(content={"msg": "Route"}, status_code=200)
方案2:用functools.partial绑定参数
借助functools.partial提前绑定固定参数,再通过辅助依赖函数接收Request:
from fastapi import Depends, Request, JSONResponse from fastapi.routing import APIRouter from functools import partial some_router = APIRouter() async def do_something(request: Request, value: str): pass # 绑定固定参数 bound_do_something = partial(do_something, value="some-argument") async def depend_do_something(request: Request): return await bound_do_something(request) @some_router.post("/some-route") async def handleRoute(something = Depends(depend_do_something)): return JSONResponse(content={"msg": "Route"}, status_code=200)
方案3:直接定义专用依赖函数
如果固定参数不需要动态调整,直接写一个专用依赖函数,内部调用时传入固定值:
from fastapi import Depends, Request, JSONResponse from fastapi.routing import APIRouter some_router = APIRouter() async def do_something(request: Request, value: str): pass async def depend_do_something(request: Request): return await do_something(request, "some-argument") @some_router.post("/some-route") async def handleRoute(something = Depends(depend_do_something)): return JSONResponse(content={"msg": "Route"}, status_code=200)
内容的提问来源于stack exchange,提问作者ILIKETOLEARN
相关产品推荐
相关产品推荐

