3

这让我发疯了,因为它应该很简单,但我肯定缺少一些 Python 怪癖。我有一个装饰器,我正在尝试将其应用于 Flask 路由,但由于某种原因,我的 views.py 中的装饰器似乎都没有被加载。

装饰器.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

视图.py

@admin_required
@blueprint.route('/')
def index():
    return render_template('index.html')

没有调用装饰器admin_required函数(加载 index.html 时没有重定向),我不知道为什么。

4

1 回答 1

6

简短回答:更改装饰器的顺序;blueprint.route仅“看到”您未修饰的功能。

装饰器由内而外地应用,类似于函数调用。因此,您的函数定义等效于:

def index():
    return render_template('index.html')
index = blueprint.route('/')(index)
index = admin_required(index)

请注意blueprint.routeindex函数被admin_required. 当然,admin_required最终确实会应用于index模块中的名称,因此如果您要直接调用 index,它将通过两个装饰器。但是您不是直接调用它,而是告诉烧瓶的请求处理器调用它。

于 2013-07-05T18:42:41.657 回答