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的东西很陌生

我需要向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的东西很陌生,我如何纠正这个错误?

好的,我通过阅读@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