flask框架(九): 请求和响应扩展以及中间件

一:请求响应扩展

# 每一次访问都执行
# 注意请求之前按照顺序执行
# 请求之后按照书写顺序倒序执行
# 请求之前执行
@app.before_request
def process_request1(*args, **kwargs):
    print('process_request1')
    return None  # 如果不是return None 访问就被拦截了,就不会执行url对应的函数,但是会执行after_request装饰的函数


@app.before_request
def process_request2(*args, **kwargs):
    print('process_request2')
    return None


# 访问结束后执行
@app.after_request
def process_response1(response):
    print('process_response1')
    return response


@app.after_request
def process_response2(response):
    print('process_response2')
    return response



##########################

# 第一次请求的时候执行
@app.before_first_request
def first(*args, **kwargs):
    pass

二:访问请求扩展的例子-登录验证

# 使用扩展来解决登录问题,比用装饰器好,每次访问之前都执行
@app.before_request
def process_request(*args, **kwargs):
    if request.path == '/login':  # 设置白名单
        return None
    user = session.get('user_info')
    if user:
        return None
    url = url_for('l1')  # 根据别名生成url
    return redirect(url)

三:其他小扩展

# 定制错误信息,根据错误码定制
@app.errorhandler(404)
def error_404(arg):
    return '404错误'


# 模板语言定制,定制模板方法
@app.template_global()
def ab(a1, a2):
    return a1 + a2


# 在模板语言中调用{{ab(1,2)}}

@app.template_filter()
def db(a1, a2, a3):
    return a1 + a2 + a3


# 在模板语言中调用{{1|db(2,3)}} |前面表示a1

四:封装源码自定义中间件

# 自定义中间件
class Md(object):
    def __init__(self, old_wsgi_app):
        self.old_wsgi_app = old_wsgi_app

    def __call__(self, environ, start_response, *args, **kwargs):
        print('开始之前')
        ret = self.old_wsgi_app(environ, start_response) # 使用它原来的东西执行,在这基础上扩展执行之前和执行之后
        print('开始之后')
        return ret


# 这个中间件通过如下调用:
# if __name__ == '__main__':
#   app.wsgi_app = Md(app.wsgi_app)
#   app.run()
原文地址:https://www.cnblogs.com/felixwang2/p/9267500.html