未调用函数装饰器

泰勒零食

这让我发疯了,因为它应该是如此简单,但是我一定缺少一些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的请求处理器调用它。indexadmin_requiredadmin_requiredindex index

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章