before-request , after-request

 1 . flask的中間件django

  1)@app.before_request     # 請求進入視圖函數以前,相似於django中間件的request_processflask

  2)@app.after_request      # 響應返回客戶端以前,相似於django中間件的response_processapp

  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,打印結果以下 : spa

  我是be1
  我是be2
  我是be3
  我是視圖函數
  我是af3
  我是af2
  我是af1

  分析:@app.after_request自上而下依次執行,@app.after_request自下而上依次執行。與django的中間件相似,@app.after_request裝飾的函數不寫return或者returnNone表示放行,順利經過,不然攔截請求,返回響應。@app.after_request裝飾的函數必定要有返回值,且必須有參數接收response對象。debug

  修改be1函數爲以下代碼:code

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

  執行結構以下 : server

  我是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錯誤時,會看到該函數的返回內容.

本站公眾號
   歡迎關注本站公眾號,獲取更多信息