为烧瓶中的视图函数定义装饰器

时间:2014-07-03 23:09:37

标签: python debugging flask python-decorators

我已尝试在flask中实现最小登录系统,因此我定义了一个装饰器,用于检查会话中的元素是否具有特定值,如果有,则用户无法访问该页面被装饰师包裹着。

这是包装的视图功能:

@mustBelongToARoom
@app.route('/draw')
def draw():
    return render_template('draw.html')

这是装饰者

def mustBelongToARoom(f):
    @wraps(f)
    def wrap_f(*args, **kwargs):
        print 'test\n'
        if session['room_name'] is None:
            return render_template(url_for('/'))
        return f(*args, **kwargs)
    return wrap_f

因此,基本上,如果room_nameNone,则用户无法访问draw页面。 问题是它似乎忽略了装饰器添加的代码。例如,采用此版本的mustBelongToARoom装饰器:

   def mustBelongToARoom(f):
        @wraps
        def wrap_f(*args, **kwargs):
            print 'test\n'
            if session['room_name'] is None:
                print '[DEBUG] you are not allowed to acces this page!\n'
                return render_template(url_for('/'))
            return f(*args, **kwargs)
        return wrap_f

当用户尝试访问[DEBUG] you are not allowed to acces this page!\n页面时,我希望在控制台中看到draw,但它不会显示它。

1 个答案:

答案 0 :(得分:2)

尝试颠倒您应用装饰器的顺序。路径装饰器仅添加了draw()函数,而不是mustBelongToARoom返回的函数,其中包括您的身份验证方案。

装饰器工作原理的一个很好的参考:How to make a chain of function decorators?