如何在FastAPI路由函数中获取全局依赖的返回值
问题解答
可以在read_items路由函数中获取到verify_key依赖的返回值,FastAPI在单个请求的生命周期内会对相同依赖做缓存,同一个依赖只会执行一次,不会重复触发Header校验逻辑,没有额外性能损耗。
推荐实现方式
方式1:路由显式声明依赖(无需修改原有依赖代码)
直接在路由函数的参数中再次声明verify_key依赖即可拿到返回值,全局注入的依赖和路由参数的依赖会共享执行结果,校验逻辑只会运行一次:
from fastapi import Depends, FastAPI, Header, HTTPException async def verify_key(x_key: str = Header(...)): if x_key != "fake-super-secret-key": raise HTTPException(status_code=400, detail="X-Key header invalid") return x_key app = FastAPI(dependencies=[Depends(verify_key)]) @app.get("/items/") # 直接在此处添加依赖声明即可拿到返回值,不会重复执行verify_key async def read_items(x_key: str = Depends(verify_key)): # 这里可以直接使用拿到的x_key print("拿到的X-Key为:", x_key) return [{"item": "Portal Gun"}, {"item": "Plumbus"}]
方式2:依赖写入request.state(适合多路由复用场景)
如果有大量路由都需要用到x_key值,可以修改verify_key依赖把值写入请求对象的state属性,后续所有路由都可以通过注入Request对象直接取值:
from fastapi import Depends, FastAPI, Header, HTTPException, Request async def verify_key(x_key: str = Header(...), request: Request = None): if x_key != "fake-super-secret-key": raise HTTPException(status_code=400, detail="X-Key header invalid") # 将x_key写入请求状态 request.state.x_key = x_key return x_key app = FastAPI(dependencies=[Depends(verify_key)]) @app.get("/items/") async def read_items(request: Request): # 直接从request.state中取值 x_key = request.state.x_key print("拿到的X-Key为:", x_key) return [{"item": "Portal Gun"}, {"item": "Plumbus"}]
版本兼容性说明
上述两种写法在你的运行环境FastAPI 0.68.0 + Python 3.8中完全可用,无兼容性问题。
内容的提问来源于stack exchange,提问作者A_zc
相关产品推荐
相关产品推荐

