Python API授权:如何在Depends方法中传入Request与权限参数
解决FastAPI中依赖注入同时获取Request与自定义权限参数的问题
问题根源在于:直接在Depends中调用check_permission(permission=xxx)时,函数会被立即执行,但此时FastAPI还未注入Request对象,因此会抛出缺少request参数的错误。需要让Depends接收一个能接收Request参数、同时携带自定义权限信息的可调用对象,以下是两种可行方案:
方案一:使用闭包(嵌套函数)
通过外层函数接收权限参数,返回一个内层函数来处理Request注入与权限校验:
from fastapi import Request, Depends def check_permission(permission: str = ""): def inner(request: Request): role = request.state.role if role not in cache: cache[role] = role_service.get_permission_by_role(role) permission_list = cache[role] return permission_list.find(permission) > -1 return inner
接口中使用方式不变:
@router.post('/banners', dependencies=[Depends(check_permission(permission=PermissionCodes.ADD_SITE_CONTENT))]) def add_banner(request: Request, file: UploadFile = File(...)): # 接口业务逻辑
方案二:使用类依赖
定义一个类,通过构造方法接收权限参数,实现__call__方法处理Request注入与校验:
from fastapi import Request, Depends class PermissionChecker: def __init__(self, permission: str = ""): self.permission = permission def __call__(self, request: Request): role = request.state.role if role not in cache: cache[role] = role_service.get_permission_by_role(role) permission_list = cache[role] return permission_list.find(self.permission) > -1
接口中使用方式:
@router.post('/banners', dependencies=[Depends(PermissionChecker(permission=PermissionCodes.ADD_SITE_CONTENT))]) def add_banner(request: Request, file: UploadFile = File(...)): # 接口业务逻辑
两种方案对比:闭包写法更简洁,适合简单校验场景;类依赖更易扩展,适合需要初始化额外参数或包含复杂逻辑的权限校验场景。
内容的提问来源于stack exchange,提问作者Sweety Kothari
相关产品推荐
相关产品推荐

