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): 监听到哪一个错误码就执行对应的函数

 

原文地址:https://www.cnblogs.com/594504110python/p/10134300.html