You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 07:36:00