跟我學Flask(五)-異常處理與請求鉤子
阿新 • • 發佈:2018-11-17
在開始講解異常處理之前,先科普一下常見的狀態碼
一、網站常見狀態碼
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)