我正在尝试向我的Bottle应用添加access_rights
装饰器,以便在访问路线时检查权限。但是,它没有获取装饰函数的参数,这会在尝试再次调用我的装饰函数时导致错误。
以下是使用装饰器的代码示例:
@route('/users')
@access_rights({'POST': ['admin']})
def users(user):
pass
user
参数来自我编写的Bottle插件,该插件从通过请求传递的令牌中获取用户。这是我现在的装饰师:
def access_rights(permissions):
def decorator(f):
def wrapper(*args, **kwargs):
# Check permissions rights here (not implemented yet)
return f(*args, **kwargs)
return wrapper
return decorator
有了这个,我在执行TypeError: users() takes exactly 1 argument (0 given)
时得到GET /users
,这意味着args
和kwargs
都是空的。但是,当我按如下方式更改装饰器时,它可以工作:
def access_rights(permissions):
def decorator(f):
return f
return decorator
我没有经常使用装饰器,但根据我的理解,上面的两个实现都应该使用原始参数调用users
函数,但由于某种原因,第一个没有得到参数。那是为什么?
答案 0 :(得分:0)
您的路由处理程序函数users
需要一个参数。
但你的装扮师access_rights
,你缠绕users
,并没有通过user
param;它只是传递它收到的任何参数(在这种情况下,没有任何参数,因此" 0给出"错误信息的一部分)。
一个例子应该有助于澄清。这是一个小而完整的应用程序,基于您的原始代码:
from bottle import route, Bottle
app = Bottle()
def access_rights(permissions):
def decorator(f):
def wrapper(*args, **kwargs):
# Check permissions rights here (not implemented yet)
the_user = 'ron' # hard-coded for this example
return f(the_user, *args, **kwargs)
return wrapper
return decorator
@app.route('/users')
@access_rights({'POST': ['admin']})
def users(user):
return ['hello, {}'.format(user)]
app.run(host='127.0.0.1', port=8080, debug=True)
请注意,我所做的唯一重大改变是让access_rights
实际传递用户参数。 (当然,它如何决定用户对你的影响 - 可能是你在评论中提到的那部分未被实现的部分。
希望有所帮助!