自定義錯誤頁面
當程序返回錯誤響應時,會渲染一個默認的錯誤頁面,我們可以注冊錯誤處理函數來處理錯誤頁面
錯誤處理函數和視圖函數很相似,返回值將作為響應的主題,因此我們先要創建錯誤頁面的模板文件。為了和普通模板區分開,我們在模板文件夾templates里建一個errors子文件夾,在其中為最常見的404和500錯誤創建模板文件
404頁面模板404.html
1 {% extends 'base.html' %} 2 {% block title %}404 -Page Not Found{% endblock %} 3 {% block content %} 4 <h1>Page Not Found</h1> 5 <p>You are lost...</p> 6 {% endblock %}
錯誤處理函數需要附加app.errorhandler()裝飾器,並傳入錯誤狀態碼作為參數。錯誤處理函數,並在返回值中注明對應的HTTP狀態碼。當發生錯誤時,對應的錯誤處理函數會被調用,它的返回值會作為錯誤響應的主體。
下面例子是用來捕捉404錯誤的錯誤處理器:
1 #encoding=utf-8 2 from flask import Flask,render_template 3 4 app=Flask(__name__) 5 6 @app.errorhandler(404) 7 def page_not_found(e): 8 return render_remplate('error/404.html'),404
錯誤處理函數接收異常對象作為參數,內置的異常對象提供了下列常用屬性,如:
Werkzeug內置的HTTP異常類的常用屬性:
如果不想手動編寫錯誤頁面的內容,可以將這些信息傳入錯誤頁面模板,在模板中用它們來構建錯誤頁面。不過需要注意的是,傳入500錯誤處理器的真正的異常對象,通常不會提供這幾個屬性,你需要手動編寫這些值。
Flask通過拋出Werkzeug中定義的HTTP異常類來標識HTTP錯誤,錯誤處理函數接收的參數就是對應的異常類。基於這個原理,你可以使用app.errorhandler()裝飾器為其他異常注冊處理函數,並返回自定義響應,只需要在app.errorhandler()裝飾器中傳入對應的異常類即可。比如使用app.errorhandler(NameError)可以注冊處理NameError異常的函數。
這時如果訪問一個錯誤的URL(127.0.0.1:5000/wwww),就會看到這樣的錯誤頁面
對應代碼,app.py
1 #encoding=utf-8 2 from flask import Flask,render_template 3 4 app=Flask(__name__) 5 6 @app.errorhandler(404) 7 def page_not_found(e): 8 return render_template('errors/404.html'),404 9 10 @app.route('/') 11 def index(): 12 return render_template('index.html') 13 14 if __name__ == '__main__': 15 app.run(debug = True)