我正在尝试包装用于烧瓶(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
答案 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