我试图添加一个access_rights
修饰器到我的Bottle应用程序来检查访问路线时的权限。但是,它没有获取装饰函数的参数,这会在尝试再次调用装饰函数时导致错误。修饰器没有得到参数
下面是一个使用装饰的代码示例:
@route('/users')
@access_rights({'POST': ['admin']})
def users(user):
pass
的user
参数来源于瓶插件,我写的会从与请求传递令牌用户。这是我目前装饰:
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
功能,其原有的参数,但对于第一个没有得到参数的原因。这是为什么?
此代码适用于我。如果你的第二个装饰器语法有效,那么这意味着你没有使用它的参数:即你只是'@ access_rights'而不是'@access_rights(whatever)'。 –
也许在某处检查函数名称?在这种情况下,包装器上方的@ functools.wrap(f)应该有所帮助。 – Artyer
你使用py2还是py3?我不认为这会产生巨大的影响,但我很好奇。 –