欢迎来到夜的世界

莫听穿林打叶声,何妨吟啸且徐行。竹杖芒鞋轻胜马,谁怕?一蓑烟雨任平生.料峭春风吹酒醒,微冷,山头斜照却相迎。回首向来萧瑟处,归去,也无风雨也无晴。
扩大
缩小

before-request , after-request

 1 . flask的中间件

  1)@app.before_request     # 请求进入视图函数之前,类似于django中间件的request_process

  2)@app.after_request      # 响应返回客户端之前,类似于django中间件的response_process

  manage.py 代码如下 : 

 from flask import Flask

  app = Flask(__name__)

  @app.before_request
  def be1():
    print('我是be1')

  @app.before_request
  def be2():
    print('我是be2')

  @app.before_request
  def be3():
    print('我是be3')

  @app.after_request
  def af1(response):
    print('我是af1')
    return response

  @app.after_request
  def af2(response):
    print('我是af2')
    return response

  @app.after_request
  def af3(response):
    print('我是af3')
    return response

  @app.route('/index')
  def index():
    print('我是视图函数')
    return 'ok'

  if __name__ == '__main__':
    app.run(debug=True)

  启动项目, 访问 http://127.0.0.1:5000/index,打印结果如下 : 

  我是be1
  我是be2
  我是be3
  我是视图函数
  我是af3
  我是af2
  我是af1

  分析:@app.after_request自上而下依次执行,@app.after_request自下而上依次执行。与django的中间件类似,@app.after_request装饰的函数不写return或者returnNone表示放行,顺利通过,否则拦截请求,返回响应。@app.after_request装饰的函数一定要有返回值,且必须有参数接收response对象。

  修改be1函数为如下代码:

  @app.before_request
  def be2():
    print('我是be2')
    return 'error'

  执行结构如下 : 

  我是be1
  我是af3
  我是af2
  我是af1

     注意      

与 Django的中间件还是有区别的,

 

 

正常情况下 : be1 - be2 - be3 - af3 - af2 - af1

异常情况下 : be1 - be2- af3 - af2 - af1

在Flask的特殊装饰器 before_request 和 after_request 中,不管请求进入试图函数之前会走到哪一步,在响应的时候都要从做开始做响应.

 

 2 . 重定义错误页面返回信息 

  @app.errorhandler(404)# 参数是错误代码
  def error404(error_info):# 注意,一定要加参数接收错误信息
    print(error_info)   
    # 404 Not Found: The requested URL was not found on the server.  If you entered the URL manually please check your spelling and try again.
    return '页面不存在'# 可以返回 三剑客 + 小儿子

  当访问发生404错误时,会看到该函数的返回内容.

 

posted on 2019-01-11 21:04  二十四桥_明月夜  阅读(1127)  评论(0编辑  收藏  举报

导航