如何为FastAPI的APIRouter所有路由注入依赖返回值?
在FastAPI中通过APIRouter全局注入带返回值的依赖
你当前的写法无法将Permissions实例注入到路由函数中,因为APIRouter的dependencies参数仅会执行依赖函数,但不会自动将其返回值绑定到路由的参数上。要实现全局注入并让所有路由能获取到Permissions实例,有两种简洁的方案:
方案一:利用Request.state存储依赖实例
这种方式不需要修改路由函数的参数声明逻辑,只需在依赖函数中将实例存入请求状态,再在路由中读取:
from fastapi import APIRouter, Depends, Request class Permissions: def __init__(self, user_id: int): self.user_id = user_id # 这里可以添加权限初始化逻辑 def get_permissions(request: Request): # 模拟生成Permissions实例,实际场景可从认证信息、数据库等获取 permissions = Permissions(user_id=123) request.state.permissions = permissions return permissions # 全局添加依赖到APIRouter my_module = APIRouter(prefix="/abc", dependencies=[Depends(get_permissions)]) @my_module.get('/') def route_1(request: Request): # 从请求状态中取出Permissions实例 permissions = request.state.permissions return {"current_user_id": permissions.user_id} @my_module.get('/a') def route_2(request: Request): permissions = request.state.permissions return {"current_user_permissions": permissions.user_id}
方案二:自定义路由装饰器自动注入依赖
如果希望保持路由函数参数的清晰性,可以自定义装饰器,自动为每个路由添加Permissions依赖:
from fastapi import APIRouter, Depends class Permissions: def __init__(self, user_id: int): self.user_id = user_id def get_permissions(): return Permissions(user_id=123) my_module = APIRouter(prefix="/abc") # 自定义装饰器,自动注入Permissions依赖 def inject_permissions(func): def wrapper(permissions: Permissions = Depends(get_permissions), *args, **kwargs): return func(permissions, *args, **kwargs) return wrapper @my_module.get('/') @inject_permissions def route_1(permissions: Permissions): return {"user_id": permissions.user_id} @my_module.get('/a') @inject_permissions def route_2(permissions: Permissions): return {"user_id": permissions.user_id}
关键说明
APIRouter的dependencies参数设计初衷是执行全局前置逻辑(如认证校验、请求参数预处理),而非传递实例给路由函数。上述两种方案分别通过请求状态存储、装饰器自动注入的方式,实现了你想要的全局依赖注入效果。
内容的提问来源于stack exchange,提问作者Rohit
相关产品推荐
相关产品推荐

