Flask中那些特殊的装饰器
模板相关的装饰器
@app.template_global()
用法:
@app.template_global() # 记得加括号 def jiafa(a, b): # 这个方法每调用一次就需要传一次, 将他做成一个全局的就用这么麻烦了 return int(a) + int(b)
在模板中这样使用
<h2>{{ jiafa(100, 30)}}</h2>
可以在全局范围的模板中使用这个函数, 而不用通过参数传到模板中
@app.template_filter()
用法:
@app.template_filter() def jianfa(a, b, c): return a - b - c
在模板中这样使用
<h2>{{ 100|jianfa(100, 300) }}</h2>
类似于django中间件的装饰器
@app.before_request
用法:
@app.before_request def confirm(): """ 在执行视图函数之前执行 :return: """ if session.get('auth') or request.path == "/login" or request.path.startswith('/static'): return None else: next_url = request.path return redirect('/login?next=%s' % (next_url,))
@app.after_request
用法:
@app.after_request def access_login(response): """ 视图函数执行完毕并执行成功后执行 :param response: 必须接受一个response :return: """ ip = request.remote_addr url = request.path print("%s访问 %s 成功" % (ip, url)) return response # 必须返回一个response对象
@app.errorhandler(404)
@app.errorhandler(404) # 404: 监听的错误码 def error(args): """ 当出现某个错误状态码时会调用这个函数 :param args: 错误信息 :return: """ return render_template("error.html")
不同装饰器的执行的顺序
多个被装饰器装饰的函数的执行顺序是什么呢?
@app.after_request: 按照代码顺序, 从上往下执行
@app.after_request: 按照代码顺序, 从下往上执行
@app.errorhandler(404): 监听到哪一个错误码就执行对应的函数