函数装饰器未被调用

Tyl*_*eat 3 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
Run Code Online (Sandbox Code Playgroud)

views.py

@admin_required
@blueprint.route('/')
def index():
    return render_template('index.html')
Run Code Online (Sandbox Code Playgroud)

admin_required装饰功能不会被调用(index.html的加载没有重定向),我想不通为什么.

use*_*342 6

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

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

def index():
    return render_template('index.html')
index = blueprint.route('/')(index)
index = admin_required(index)
Run Code Online (Sandbox Code Playgroud)

注意如何blueprint.routeindex函数被包装之前传递该函数admin_required.当然,admin_required最终会被应用到index模块中的名称,所以如果你直接调用 index它,它将通过两个装饰器.但是你没有直接调用它,你告诉烧瓶的请求处理器调用它.