这让我发疯了,因为它应该是如此简单,但是我一定缺少一些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的加载没有重定向),我想不通为什么。
简短的答案:更改装饰器的顺序;blueprint.route
仅“看到”您未修饰的功能。
装饰器由内而外地应用,与函数调用大致类似。因此,您的函数定义等效于:
def index():
return render_template('index.html')
index = blueprint.route('/')(index)
index = admin_required(index)
注意函数在被包裹之前blueprint.route
是如何传递的。当然,确实会最终将其应用于模块中的名称,因此,如果您要直接调用,它将同时经过两个装饰器。但是,您并不是直接调用它,而是告诉flask的请求处理器调用它。index
admin_required
admin_required
index
index
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句