Flask 的 debug 模式
使用 Flask 開發(fā)過程中存在兩個(gè)常見的問題:
- 當(dāng) Flask 程序出錯(cuò)時(shí),沒有提示錯(cuò)誤的詳細(xì)信息;
- 修改 Flask 源代碼后需要重啟 Flask 程序。
這兩個(gè)問題非常的影響開發(fā)效率,因此 Flask 引入了 debug 模式解決以上問題。本節(jié)講解如何啟用 debug 模式,并通過具體的例子,講解在 debug 模式下是如何解決以上問題的。
Tips:本節(jié)課所有代碼已經(jīng)上傳到了 Github,可以點(diǎn)擊這里進(jìn)行下載。
1. 開發(fā)中的常見問題
1.1 沒有提示錯(cuò)誤的詳細(xì)信息
如果 Flask 程序中有錯(cuò)誤,在瀏覽器界面中看不到錯(cuò)誤的詳細(xì)信息。下面是一個(gè)包含錯(cuò)誤的 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 行,存在一個(gè)除以零的錯(cuò)誤,在瀏覽器中訪問該 Flask 程序,顯示如下:
瀏覽器中提示 Internal Server Error,表示服務(wù)端程序出現(xiàn)錯(cuò)誤,但是沒有給出錯(cuò)誤的詳細(xì)信息,即產(chǎn)生錯(cuò)誤的文件、函數(shù)、行號等位置信息,排查錯(cuò)誤非常不方便。
1.2 修改源代碼后需要重啟
開發(fā) Flask 程序有如下 3 個(gè)步驟:
- 編輯 Flask 源程序
- 在命令行中啟動(dòng) Flask 程序
- 在瀏覽器中訪問 Flask 程序
每次對 Flask 源程序進(jìn)行修改后,都需要重啟動(dòng) Flask 程序。例如,編寫如下 Flask 程序:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return '<b>hello world</b>'
if __name__ == '__main__':
app.run()
程序的功能:訪問頁面 / 時(shí),返回文本 ‘hello world’,現(xiàn)在希望返回文本 ‘HELLO WORLD’,需要做如下工作:
- 切換到編輯器,編輯 Flask 源程序,將 ‘hello world’ 修改為 ‘HELLO WORLD’
- 切換到終端,終止原先運(yùn)行的 Flask 程序,再次運(yùn)行 Flask 程序
- 切換到瀏覽器,訪問頁面 /
在開發(fā)的過程中,需要在編輯器、終端、瀏覽器這 3 個(gè)程序之間來回切換,非常的繁瑣。
這個(gè)時(shí)候,我們就需要使用 Debug 模式來快速解決上面的這兩個(gè)問題:
2. Flask 的 Debug 模式
2.1 簡介
Flask 程序可以運(yùn)行在 Debug 模式下,Debug 模式提供了如下功能:
- 當(dāng) Flask 程序出現(xiàn)錯(cuò)誤時(shí),在瀏覽器中提示錯(cuò)誤的詳細(xì)信息
- 修改 Flask 程序代碼后,F(xiàn)lask 程序會重新加載,不需要重啟 Flask 程序,即可在瀏覽器中看到修改后的效果
調(diào)用 Flask 應(yīng)用的 run 方法時(shí),設(shè)置參數(shù) Debug = True,啟動(dòng) Flask 程序的調(diào)試模式。編寫程序 debug-on.py 如下:
from flask import Flask
app = Flask(__name__)
if __name__ == '__main__':
app.run(debug = True)
在第 5 行,app.run(debug = True),啟動(dòng) Flask 程序的調(diào)試模式。運(yùn)行程序,輸出如下:
$ 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 程序已經(jīng)進(jìn)入了調(diào)試模式。
2.2 提示錯(cuò)誤的詳細(xì)信息
編寫一個(gè)包含錯(cuò)誤的 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 行,函數(shù) hello_world 中,存在一個(gè)除以 0 的錯(cuò)誤;在第 11 行,設(shè)置 debug = True 啟用調(diào)用模式,運(yùn)行程序,在瀏覽器中顯示如下:
瀏覽器中顯示錯(cuò)誤類型 ZeroDivisionError,并給出了錯(cuò)誤的詳細(xì)位置:bug.py, line 7, in hello_world,給調(diào)試程序提供了方便。
2.3 修改源碼不用重啟
啟用調(diào)試模式后,不用重啟 Flask 程序,即可在瀏覽器中看到修改后的效果,本節(jié)演示這個(gè)過程。
編寫 Flask 程序
編寫一個(gè) Flask 程序 reload.py,使用 app.run(debug = True) 啟用調(diào)試模式:
#!/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)
啟動(dòng) Flask 程序
在終端啟動(dòng) 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é)
本節(jié)首先介紹了影響開發(fā)效率的兩個(gè)常見問題,講解 Flask 中的 debug 模式的功能,通過具體的例子,講解 debug 模式的兩個(gè)主要優(yōu)點(diǎn):
- Flask 程序發(fā)生錯(cuò)誤時(shí),在瀏覽器中可以看到錯(cuò)誤消息;
- 修改源代碼后,不需要重啟 Flask 程序。
使用思維導(dǎo)圖總結(jié)如下: