带参数的Python / Flask嵌套装饰器

时间:2019-09-13 20:29:42

标签: python flask python-decorators

我正在尝试包装用于烧瓶(Flask-Kerberos)的身份验证装饰器。我需要将参数传递给包装器,但似乎无法弄清楚该怎么做。

原始工作代码:

#main.py:
@app.route("/")
@requires_authentication
def index(user):
    return render_template('index.html', user=user)

无法正常工作的代码,但说明了我要执行的操作:

#main.py
from auth import customauth
@app.route("/")
@customauth(config)
def index(user):
    return render_template('index.html', user=user)
#auth.py
def customauth(*args, **kwargs): 
    @requires_authentication
    def inner(func):
        print(config)
        return func
    return inner

1 个答案:

答案 0 :(得分:0)

def customauth(config):
    def decorator(func):
        @requires_authentication
        def wrapper(*args, **kwargs):
            print(config)
            return func(*args, **kwargs)

        return wrapper

    return decorator

如果您查找有关带有参数的装饰器的教程,基本上就是您会看到的。最外层的函数接受参数。内部的是接收装饰功能的实际装饰器。最内层的是替换index的最终结果。要理解它,想象一下展开函数调用。这段代码:

@customauth(config)
def index(user):

等效于:

@decorator  # for some specific config
def index(user):

等效于:

@requires_authentication
def wrapper(*args, **kwargs):
    print(config)
    return index(*args, **kwargs)  # func = index