1. 程式人生 > >跟我學Flask(五)-異常處理與請求鉤子

跟我學Flask(五)-異常處理與請求鉤子

在開始講解異常處理之前,先科普一下常見的狀態碼

一、網站常見狀態碼

Type Reason-phrase Note
1XX Informational 資訊性狀態碼,表示接受的請求正在處理
2XX Success 成功狀態碼,表示請求正常處理完畢
3XX Redirection 重定向狀態碼,表示需要客戶端需要進行附加操作
4XX Client Error 客戶端錯誤狀態碼,表示伺服器無法處理請求
5XX Server Error 伺服器錯誤狀態碼,表示伺服器處理請求出錯

301 - 已永久移動
302 - 物件已移動。
304 - 未修改。
400 - 錯誤的請求。
401 - 訪問被拒絕。
403 - 禁止訪問。
404 - 未找到。
500 - 內部伺服器錯誤。
503 - 服務不可用。這個錯誤程式碼為 IIS 6.0 所專用。
504 - 閘道器超時。
505 - HTTP 版本不受支援。

二、異常處理(abort)

flask中的異常處理:abort函式,類似python中raise語句,丟擲異常

1、abort只能丟擲符合http協議的異常狀態碼

2、abort一旦被觸發,終止程式執行,直接返回了響應報文,後面的程式碼不會執行。

@app.route('/')
def index():
    # 400壞的請求
    # 403沒有許可權
    # 404找不到
    # 405請求方法不允許
    # try:
    #     查詢資料庫
    # except Exception as e:
    #     abort(500)
    abort(500)
    return 'hello world',400

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

三、自定義錯誤介面

# 自定義錯誤頁面,errorhandler接收的引數為異常狀態碼
# 1、errorhandler修飾的函式必須接受錯誤資訊作為引數,可以不返回

@app.errorhandler(500)
def err_handler(e):
    return '伺服器搬家了,請訪問*****連結'

四、請求鉤子

在客戶端和伺服器互動的過程中,有些準備工作或掃尾工作需要處理,比如:

  • 在請求開始時,建立資料庫連線;
  • 在請求開始時,根據需求進行許可權校驗;
  • 在請求結束時,指定資料的互動格式;

為了讓每個檢視函式避免編寫重複功能的程式碼,Flask提供了通用設施的功能,即請求鉤子。

請求鉤子是通過裝飾器的形式實現,Flask支援如下四種請求鉤子:

請求鉤子所指的異常是伺服器內部程式碼出現的異常,手動丟擲或者請求異常不會被鉤子識別

  • before_first_request
    • 在處理第一個請求前執行
  • before_request
    • 在每次請求前執行
    • 如果在某修飾的函式中返回了一個響應,檢視函式將不再被呼叫
  • after_request
    • 如果沒有丟擲錯誤,在每次請求後執行
    • 接受一個引數:檢視函式作出的響應
    • 在此函式中可以對響應值在返回之前做最後一步修改處理
    • 需要將引數中的響應在此引數中進行返回
  • teardown_request:
    • 在每次請求後執行
    • 接受一個引數:錯誤資訊,如果有相關錯誤丟擲
from flask import Flask
from werkzeug.routing import Rule,Map,MapAdapter,BaseConverter
app = Flask(__name__)

@app.route('/')
def index():
    print('index run---')
    # abort(400)
    return 'hello world'

# 請求鉤子:四種,兩種在請求前執行,兩種在請求後執行

# 請求前執行
# before_first_request在第一次請求前執行,只執行一次。
@app.before_first_request
def befor_firt_request():
    print('before first request run---')

# 在每次請求前都執行
@app.before_request
def before_request():
    print('before request run---')

# 請求後執行
# after_request:沒有異常的情況下,在每次請求後執行,接收的引數為響應物件
@app.after_request
def after_request(response):
    print('after request run---')
    # 修改響應的型別
    response.headers['Content-Type'] = 'application/json'
    return response

# teardown_request:即使有異常,在每次請求後執行,接收的引數為異常資訊
@app.teardown_request
def teardown_reqeust(e):
    print('teardown request run---')


# 異常:可以通過手動觸發實現異常嗎?abort(400)
# 異常到底是指什麼異常?

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