我已尝试在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_name
为None
,则用户无法访问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
,但它不会显示它。
答案 0 :(得分:2)
尝试颠倒您应用装饰器的顺序。路径装饰器仅添加了draw()
函数,而不是mustBelongToARoom
返回的函数,其中包括您的身份验证方案。
装饰器工作原理的一个很好的参考:How to make a chain of function decorators?