在多个装饰器之间传递参数

2024-04-18 13:44:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用两个decorator来修饰一个函数“add\u user”,第一个@auth\u user通过json web token请求头对登录用户进行身份验证,并将用户信息作为参数“user\u info”返回给修饰函数add\u user。第二个decorator@has\ permission应该检查用户是否对请求的资源有权限。我想把@auth\u user作为user\u info返回的用户信息传递给@has\u permission,但不知道怎么做,下面是到目前为止的代码:

@has_permission
@auth_user
def add_user(user_info):
    """
    do something
    """
    return None

装饰师:

def auth_user(f):
    @wraps(f)
    def wrapper(*args, **kwargs):
        data = jwt.decode(request.headers['some-access-token'], some_secret_key)
        try:
            user_info = User.query.filter(User.id==data['user_id']).first()
        except:
            return jsonify({"message" : "error"}), 401

        return f(user_info, *args, **kwargs)

    return wrapper

第二个decorator,我想访问用户信息:

def has_permission(f):
    wraps(f)
    def wrapper(*args, **kwargs):
        # This is where I want to access the user information instead of processing the key again #
        # return some new_args ... #
        return f(*args, **kwargs)
    return wrapper

实现这一目标的最佳方法是什么?你知道吗


Tags: 用户infoauthadd信息returndefargs
1条回答
网友
1楼 · 发布于 2024-04-18 13:44:56

在一些帮助下,我成功地使这个工作和主要问题是顺序/顺序的装饰。在问题中,@has\u permission将@auth\u user作为参数,@auth\u user将原始函数add\u user作为参数,如下所示:

has_permission(auth_user(add_user(user_info)))

这意味着当返回参数时,最外层的decorator@has\u权限将把参数返回给@auth\u user,然后再添加\u user。这意味着@has\u permission无法访问@auth\u user返回的用户信息,因此我修改了原始函数:

@auth_user
@has_permission    
def add_user(user_info):
    """
    do something
    """
    return None

现在将按如下正确顺序调用decorators:

auth_user(has_permission(add_user(user_info)))

我还更改了@auth\u user注入user\u info的方式,并将其更改为kwargs而不是args,以便在@has\u permission中访问它:

def auth_user(f):
    @wraps(f)
    def wrapper(*args, **kwargs):
        data = jwt.decode(request.headers['some-access-token'], some_secret_key)
        try:
            user_info = User.query.filter(User.id==data['user_id']).first()
        except:
            return jsonify({"message" : "error"}), 401
        kwargs['user_info'] = user_info
        return f(*args, **kwargs)

    return wrapper

最后将用户信息传递给原始函数:

def has_permission(f):
    wraps(f)
    def wrapper(*args, **kwargs):
        #access user info
        user_info = kwargs['user_info']
        return f(user_info, *args, **kwargs)
    return wrapper

希望这能帮上忙!你知道吗

相关问题 更多 >