Python 带烧瓶的蟒蛇装饰器
我需要向Flask路由函数添加一个python装饰器(基本上我是从中编辑代码的) 这样使用就可以了:Python 带烧瓶的蟒蛇装饰器,python,flask,decorator,Python,Flask,Decorator,我需要向Flask路由函数添加一个python装饰器(基本上我是从中编辑代码的) 这样使用就可以了: @app.route('/admin/action') @requires_admin def AdminAction(): #NO error if NO parameter 但这样使用会有错误: @app.route('/admin/action/<int:id>') @requires_admin def AdminAction(id): 我对decorator的东西很陌生
@app.route('/admin/action')
@requires_admin
def AdminAction():
#NO error if NO parameter
但这样使用会有错误:
@app.route('/admin/action/<int:id>')
@requires_admin
def AdminAction(id):
我对decorator的东西很陌生,我如何纠正这个错误?好的,我通过阅读@will hart给出的答案解决了这个问题 我只需移除
def包装器(f)
,现在一切看起来都很好。至少没有语法错误
from functools import wraps
def requires_admin(f):
@wraps(f)
def wrapped(*args, **kwargs):
#if blah blah:
#return blah blah
return f(*args, **kwargs)
return wrapped
因为我对装潢师还很陌生,我不知道为什么。但希望这能对其他ppl有所帮助。您有两个包装器函数,其中只需要一个。请注意,每个包装函数都有一个参数。这应该是正在发生的事情的线索 你有:
def decorator(take_a_function):
def wrapper1(take_a_function):
def wrapper2(*takes_multiple_arguments):
# do stuff
return take_a_function(*takes_multiple_arguments)
return wrapper2
return wrapper1
使用它装饰函数时:
@decorator
def my_function(*takes_multiple_arguments):
pass
这相当于:
def my_function(*takes_multiple_arguments):
pass
my_function = decorator(my_function)
但是执行decorator(my_函数)
会返回wrapper1
,如果您还记得的话,它会取一个
参数,获取函数
。这显然不是你想要的。您希望返回wrapper2
。如您的回答所示,解决方案是移除外部包装(wrapper1
):
不是100%确定,但您可能需要为路由提供一个
endpoint
参数?见@will hart我刚刚更新了问题。只有使用参数才会有错误。@JamesKing这是一个很好的问题。你只是因为缺乏努力才被否决。请尝试返回,我将准备提供答案。@Avinash Raj感谢您的关注。我自己解决了那个问题。我的问题实际上是如何编辑与Python内联的文件。答案是,importfileinput
一般来说,除了包装函数外,没有参数的装饰器只需要一个内部函数。在第一个示例中,requires_admin
返回一个函数,该函数又接受第二个函数。两级修饰符用于@app.route(额外参数)
或@wrapps(f)
。
@decorator
def my_function(*takes_multiple_arguments):
pass
def my_function(*takes_multiple_arguments):
pass
my_function = decorator(my_function)
from functools import wraps
def decorator(takes_a_function):
@wraps(takes_a_function)
def wrapper(*args, **kwargs):
# logic here
return takes_a_function(*args, **kwargs)
return wrapper