Django中实现可向函数传递自定义数据的自定义装饰器方案咨询
自定义用户数据权限校验装饰器实现方案
实现思路
- 优先从请求上下文中获取当前已认证的用户对象
- 调用数据库查询逻辑,拉取该用户下符合业务规则的关联数据列表
- 若查询结果为空,直接抛出403权限错误;若查询结果存在,将数据列表注入到目标接口函数的参数中,再执行原函数逻辑
代码实现(以FastAPI异步框架为例)
首先导入所需依赖:
from functools import wraps from fastapi import HTTPException # 替换为你自己项目的数据库查询方法、用户认证逻辑依赖 from your_db_module import query_user_related_data
装饰器核心代码:
def check_user_data_perm(): def decorator(func): @wraps(func) async def wrapper(*args, **kwargs): # 从请求上下文取已登录用户,此处假设用户信息已通过认证中间件存入request.state request = kwargs.get("request") if not request or not hasattr(request.state, "user"): raise HTTPException(status_code=403, detail="用户身份未认证") current_user = request.state.user # 查询用户关联的符合要求的数据 target_data_list = query_user_related_data(user_id=current_user.id) if not target_data_list: raise HTTPException(status_code=403, detail="无对应资源访问权限") # 将查询到的数据注入原函数参数,执行原逻辑 kwargs["target_data_list"] = target_data_list return await func(*args, **kwargs) return wrapper return decorator
使用示例
from fastapi import APIRouter, Request router = APIRouter(prefix="/user") @router.get("/authorized-resources") @check_user_data_perm() async def get_user_resources(request: Request, target_data_list: list = None): # 直接使用注入的target_data_list,无需重复查询 return { "code": 200, "resources": target_data_list }
其他框架适配调整
- 同步接口/Flask框架:移除装饰器和接口函数的
async、await关键字,用户信息从flask.request或者全局变量g中获取即可 - 如需自定义数据筛选规则,可给装饰器添加入参,比如
@check_user_data_perm(data_type="order"),查询时传入参数筛选对应类型的数据即可 - 注入参数的名称可根据业务需求自定义,保持和目标函数的参数名一致即可
内容的提问来源于stack exchange,提问作者Reza
相关产品推荐
相关产品推荐

