我使用两个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
实现这一目标的最佳方法是什么?你知道吗
在一些帮助下,我成功地使这个工作和主要问题是顺序/顺序的装饰。在问题中,@has\u permission将@auth\u user作为参数,@auth\u user将原始函数add\u user作为参数,如下所示:
这意味着当返回参数时,最外层的decorator@has\u权限将把参数返回给@auth\u user,然后再添加\u user。这意味着@has\u permission无法访问@auth\u user返回的用户信息,因此我修改了原始函数:
现在将按如下正确顺序调用decorators:
我还更改了@auth\u user注入user\u info的方式,并将其更改为kwargs而不是args,以便在@has\u permission中访问它:
最后将用户信息传递给原始函数:
希望这能帮上忙!你知道吗
相关问题 更多 >
编程相关推荐