函数装饰器未被调用

时间:2013-07-05 18:41:46

标签: python google-app-engine flask python-decorators

这让我疯狂,因为它应该是如此简单,但必须有一些我错过的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),我无法弄清楚原因。

1 个答案:

答案 0 :(得分:5)

简答:改变装饰者的顺序; blueprint.route只能“看到”你未修饰的功能。

装饰器从里到外应用,与函数调用类似。因此,您的函数定义等同于:

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

请注意blueprint.routeindexadmin_required包裹之前如何传递admin_required。当然,index最终会应用于模块中的index名称,因此如果您直接调用 {{1}},它将通过两个装饰器。但是你不是直接调用它,而是告诉烧瓶请求处理器调用它。