这让我疯狂,因为它应该是如此简单,但必须有一些我错过的Python怪癖。我有一个装饰器,我正在尝试应用于Flask路线,但由于某些原因,我的views.py中的装饰器似乎都没有被加载。
decorators.py
def admin_required(func):
"""Require App Engine admin credentials."""
@wraps(func)
def decorated_view(*args, **kwargs):
if users.get_current_user():
if not users.is_current_user_admin():
abort(401) # Unauthorized
return func(*args, **kwargs)
return redirect(users.create_login_url(request.url))
return decorated_view
views.py
@admin_required
@blueprint.route('/')
def index():
return render_template('index.html')
没有调用admin_required
装饰器函数(没有重定向加载index.html),我无法弄清楚原因。
答案 0 :(得分:5)
简答:改变装饰者的顺序; blueprint.route
只能“看到”你未修饰的功能。
装饰器从里到外应用,与函数调用类似。因此,您的函数定义等同于:
def index():
return render_template('index.html')
index = blueprint.route('/')(index)
index = admin_required(index)
请注意blueprint.route
在index
被admin_required
包裹之前如何传递admin_required
。当然,index
最终会应用于模块中的index
名称,因此如果您直接调用 {{1}},它将通过两个装饰器。但是你不是直接调用它,而是告诉烧瓶请求处理器调用它。