Python 装饰师不是';不要争论
我正在尝试向我的瓶子应用程序添加一个Python 装饰师不是';不要争论,python,python-2.7,bottle,python-decorators,Python,Python 2.7,Bottle,Python Decorators,我正在尝试向我的瓶子应用程序添加一个access\u rightsdecorator,以便在访问路线时检查权限。但是,它无法获取修饰函数的参数,这会在尝试再次调用我的修饰函数时导致错误 下面是使用decorator的代码示例: @route('/users') @access_rights({'POST': ['admin']}) def users(user): pass def access_rights(permissions): def decorator(f):
access\u rights
decorator,以便在访问路线时检查权限。但是,它无法获取修饰函数的参数,这会在尝试再次调用我的修饰函数时导致错误
下面是使用decorator的代码示例:
@route('/users')
@access_rights({'POST': ['admin']})
def users(user):
pass
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
user
参数来自我编写的一个瓶子插件,该插件通过请求传递的令牌获取用户。这是我现在的装饰师:
@route('/users')
@access_rights({'POST': ['admin']})
def users(user):
pass
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()正好接受一个参数(给定0)
,这意味着args
和kwargs
都是空的。但是,当我按如下方式更改装饰器时,它会起作用:
def access_rights(permissions):
def decorator(f):
return f
return decorator
我很少使用decorator,但据我所知,上述两种实现都应该使用原始参数调用
users
函数,但由于某种原因,第一种实现没有获得参数。这是为什么?您的路由处理程序functionusers
需要一个参数
但是围绕用户
的装饰程序访问权限
,没有传递用户
参数;它只是传递它接收到的任何参数(在本例中,没有任何参数,因此错误消息的“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\u权限
实际向下传递一个用户参数。(它如何确定用户自然取决于您——可能是您在评论中提到的“尚未实现”部分)
希望有帮助 您的路由处理程序function
users
需要一个参数
但是围绕用户
的装饰程序访问权限
,没有传递用户
参数;它只是传递它接收到的任何参数(在本例中,没有任何参数,因此错误消息的“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\u权限
实际向下传递一个用户参数。(它如何确定用户自然取决于您——可能是您在评论中提到的“尚未实现”部分)
希望有帮助 这个代码对我有用。如果您的第二个decorator语法有效,那么这意味着您没有将其与参数一起使用:即您只是在执行
@access\u rights
而不是@access\u rights(无论什么)
。可能在某个地方检查了函数名?在这种情况下,包装器上方的@functools.wrapps(f)
应该会有所帮助。您使用的是py2还是py3?我不认为这有什么大区别,但我很好奇。我尝试过使用functools.wrapps
但不幸的是,它没有帮助。我忘了在我的问题中指定一些东西(在这个评论之后编辑):user
参数来自一个瓶子插件;这会影响事情吗?使用Python2。这段代码适合我。如果您的第二个decorator语法有效,那么这意味着您没有将其与参数一起使用:即您只是在执行@access\u rights
而不是@access\u rights(无论什么)
。可能在某个地方检查了函数名?在这种情况下,包装器上方的@functools.wrapps(f)
应该会有所帮助。您使用的是py2还是py3?我不认为这有什么大区别,但我很好奇。我尝试过使用functools.wrapps
但不幸的是,它没有帮助。我忘了在我的问题中指定一些东西(在这个评论之后编辑):user
参数来自一个瓶子插件;这会影响事情吗?使用Python2。我完全理解user
参数没有通过,但这不是我的装饰师的工作。如我在问题中所述,user
参数是由插件生成和传递的,因此它不应该由decorator处理。对我来说没有意义的是,直接返回f
,而不是使用传递的参数调用f
的wrapper
,不会产生相同的结果。我在这里遗漏了什么?我完全理解user
参数没有通过,但这不是我的装饰师的工作。如我在问题中所述,user
参数是由插件生成和传递的,因此它不应该由decorator处理。对我来说没有意义的是,直接返回f
,而不是使用传递的参数调用f
的wrapper
,不会产生相同的结果。我错过了什么?