一:请求响应扩展
# 每一次访问都执行 # 注意请求之前按照顺序执行 # 请求之后按照书写顺序倒序执行 # 请求之前执行 @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()