Flask 的 debug 模式
使用 Flask 開發(fā)過程中存在兩個常見的問題:
- 當 Flask 程序出錯時,沒有提示錯誤的詳細信息;
- 修改 Flask 源代碼后需要重啟 Flask 程序。
這兩個問題非常的影響開發(fā)效率,因此 Flask 引入了 debug 模式解決以上問題。本節(jié)講解如何啟用 debug 模式,并通過具體的例子,講解在 debug 模式下是如何解決以上問題的。
Tips:本節(jié)課所有代碼已經上傳到了 Github,可以點擊這里進行下載。
1. 開發(fā)中的常見問題
1.1 沒有提示錯誤的詳細信息
如果 Flask 程序中有錯誤,在瀏覽器界面中看不到錯誤的詳細信息。下面是一個包含錯誤的 Flask 程序 error.py:
#!/usr/bin/python3
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
1/0
return '<b>hello world</b>'
if __name__ == '__main__':
app.run()
在第 7 行,存在一個除以零的錯誤,在瀏覽器中訪問該 Flask 程序,顯示如下:
瀏覽器中提示 Internal Server Error,表示服務端程序出現(xiàn)錯誤,但是沒有給出錯誤的詳細信息,即產生錯誤的文件、函數、行號等位置信息,排查錯誤非常不方便。
1.2 修改源代碼后需要重啟
開發(fā) Flask 程序有如下 3 個步驟:
- 編輯 Flask 源程序
- 在命令行中啟動 Flask 程序
- 在瀏覽器中訪問 Flask 程序
每次對 Flask 源程序進行修改后,都需要重啟動 Flask 程序。例如,編寫如下 Flask 程序:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return '<b>hello world</b>'
if __name__ == '__main__':
app.run()
程序的功能:訪問頁面 / 時,返回文本 ‘hello world’,現(xiàn)在希望返回文本 ‘HELLO WORLD’,需要做如下工作:
- 切換到編輯器,編輯 Flask 源程序,將 ‘hello world’ 修改為 ‘HELLO WORLD’
- 切換到終端,終止原先運行的 Flask 程序,再次運行 Flask 程序
- 切換到瀏覽器,訪問頁面 /
在開發(fā)的過程中,需要在編輯器、終端、瀏覽器這 3 個程序之間來回切換,非常的繁瑣。
這個時候,我們就需要使用 Debug 模式來快速解決上面的這兩個問題:
2. Flask 的 Debug 模式
2.1 簡介
Flask 程序可以運行在 Debug 模式下,Debug 模式提供了如下功能:
- 當 Flask 程序出現(xiàn)錯誤時,在瀏覽器中提示錯誤的詳細信息
- 修改 Flask 程序代碼后,F(xiàn)lask 程序會重新加載,不需要重啟 Flask 程序,即可在瀏覽器中看到修改后的效果
調用 Flask 應用的 run 方法時,設置參數 Debug = True,啟動 Flask 程序的調試模式。編寫程序 debug-on.py 如下:
from flask import Flask
app = Flask(__name__)
if __name__ == '__main__':
app.run(debug = True)
在第 5 行,app.run(debug = True),啟動 Flask 程序的調試模式。運行程序,輸出如下:
$ python3 debug.py
* Serving Flask app "debug" (lazy loading)
* Environment: production
* Debug mode: on
* Restarting with stat
* Debugger is active!
* Debugger PIN: 316-471-540
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
在第 4 行,Debug mode: on,表示 Flask 程序已經進入了調試模式。
2.2 提示錯誤的詳細信息
編寫一個包含錯誤的 Flask 程序 error-debug-on.py,代碼如下:
#!/usr/bin/python3
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
1/0
return '<b>hello world</b>'
if __name__ == '__main__':
app.run(debug = True)
在第 7 行,函數 hello_world 中,存在一個除以 0 的錯誤;在第 11 行,設置 debug = True 啟用調用模式,運行程序,在瀏覽器中顯示如下:
瀏覽器中顯示錯誤類型 ZeroDivisionError,并給出了錯誤的詳細位置:bug.py, line 7, in hello_world,給調試程序提供了方便。
2.3 修改源碼不用重啟
啟用調試模式后,不用重啟 Flask 程序,即可在瀏覽器中看到修改后的效果,本節(jié)演示這個過程。
編寫 Flask 程序
編寫一個 Flask 程序 reload.py,使用 app.run(debug = True) 啟用調試模式:
#!/usr/bin/python3
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return '<b>hello world</b>'
if __name__ == '__main__':
app.run(debug = True)
啟動 Flask 程序
在終端啟動 Flask 程序,顯示如下:
修改 Flask 程序
修改 Flask 程序,原先的程序返回一段文本 ‘hello world’,現(xiàn)在將其修改為 ‘HELLO WORLD’,在編輯器中保存,然后切換到終端,終端顯示如下:
終端中顯示: * Detected change in ‘/home/guest/reload.py’, reloading
,表示 Flask 程序檢測到 reload.py 發(fā)生了變化,重新加載。
觀察修改后的效果
切換到瀏覽器,刷新頁面后,顯示字符串 ‘HELLO WORLD’。在沒有重啟 Flask 程序的情況下,可以看到修改后的效果了。效果如下所示:
3. 小結
本節(jié)首先介紹了影響開發(fā)效率的兩個常見問題,講解 Flask 中的 debug 模式的功能,通過具體的例子,講解 debug 模式的兩個主要優(yōu)點:
- Flask 程序發(fā)生錯誤時,在瀏覽器中可以看到錯誤消息;
- 修改源代碼后,不需要重啟 Flask 程序。
使用思維導圖總結如下: