2013-07-05 38 views
3

这一直让我发疯,因为它应该是如此简单,但是我一定会有一些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的加载没有重定向),并且我不能找出原因。

回答

4

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

装饰器内部应用,与功能调用类似。因此,你的函数定义等同于:

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

注意如何blueprint.route传递的index函数之前它被通过admin_required包裹。当然,admin_required确实最终会应用于模块中的index名称,所以如果您直接致电请拨index,它会经过两个装饰器。但是你不是直接调用它,而是告诉flask的请求处理器调用它。

+0

谢谢,我觉得这很简单(虽然我有点尴尬,我没有尝试过)。 –