【发布时间】:2017-11-19 06:57:37
【问题描述】:
我正在尝试在我的 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
有了这个,我在执行GET /users 时得到TypeError: users() takes exactly 1 argument (0 given),这意味着args 和kwargs 都是空的。但是,当我按如下方式更改装饰器时,它可以工作:
def access_rights(permissions):
def decorator(f):
return f
return decorator
我没有经常使用装饰器,但据我了解,上面的两个实现都应该使用其原始参数调用users 函数,但由于某种原因,第一个没有得到参数。这是为什么呢?
【问题讨论】:
-
这段代码对我有用。如果您的第二个装饰器语法有效,那么这意味着您没有将它与参数一起使用:即您只是在使用
@access_rights而不是@access_rights(whatever)。 -
也许某处检查了函数名称?在这种情况下,包装器上方的
@functools.wraps(f)应该会有所帮助。 -
你用的是py2还是py3?我不认为这有很大的不同,但我很好奇。
-
不幸的是,已经尝试使用
functools.wraps,但没有帮助。我确实忘记在我的问题中指定一些内容(在此评论之后进行编辑):user参数来自 Bottle 插件;这会影响事情吗? -
使用 Python 2。
标签: python python-2.7 bottle python-decorators