亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

Flask 的 debug 模式

使用 Flask 開發過程中存在兩個常見的問題:

  1. 當 Flask 程序出錯時,沒有提示錯誤的詳細信息;
  2. 修改 Flask 源代碼后需要重啟 Flask 程序。

這兩個問題非常的影響開發效率,因此 Flask 引入了 debug 模式解決以上問題。本節講解如何啟用 debug 模式,并通過具體的例子,講解在 debug 模式下是如何解決以上問題的。

Tips:本節課所有代碼已經上傳到了 Github,可以點擊這里進行下載。

1. 開發中的常見問題

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,表示服務端程序出現錯誤,但是沒有給出錯誤的詳細信息,即產生錯誤的文件、函數、行號等位置信息,排查錯誤非常不方便。

1.2 修改源代碼后需要重啟

開發 Flask 程序有如下 3 個步驟:

  1. 編輯 Flask 源程序
  2. 在命令行中啟動 Flask 程序
  3. 在瀏覽器中訪問 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’,現在希望返回文本 ‘HELLO WORLD’,需要做如下工作:

  1. 切換到編輯器,編輯 Flask 源程序,將 ‘hello world’ 修改為 ‘HELLO WORLD’
  2. 切換到終端,終止原先運行的 Flask 程序,再次運行 Flask 程序
  3. 切換到瀏覽器,訪問頁面 /

在開發的過程中,需要在編輯器、終端、瀏覽器這 3 個程序之間來回切換,非常的繁瑣。

這個時候,我們就需要使用 Debug 模式來快速解決上面的這兩個問題:

2. Flask 的 Debug 模式

2.1 簡介

Flask 程序可以運行在 Debug 模式下,Debug 模式提供了如下功能:

  1. 當 Flask 程序出現錯誤時,在瀏覽器中提示錯誤的詳細信息
  2. 修改 Flask 程序代碼后,Flask 程序會重新加載,不需要重啟 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 程序,即可在瀏覽器中看到修改后的效果,本節演示這個過程。

編寫 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’,現在將其修改為 ‘HELLO WORLD’,在編輯器中保存,然后切換到終端,終端顯示如下:

圖片描述

終端中顯示: * Detected change in ‘/home/guest/reload.py’, reloading
,表示 Flask 程序檢測到 reload.py 發生了變化,重新加載。

觀察修改后的效果

切換到瀏覽器,刷新頁面后,顯示字符串 ‘HELLO WORLD’。在沒有重啟 Flask 程序的情況下,可以看到修改后的效果了。效果如下所示:

圖片描述

3. 小結

本節首先介紹了影響開發效率的兩個常見問題,講解 Flask 中的 debug 模式的功能,通過具體的例子,講解 debug 模式的兩個主要優點:

  • Flask 程序發生錯誤時,在瀏覽器中可以看到錯誤消息;
  • 修改源代碼后,不需要重啟 Flask 程序。

使用思維導圖總結如下:

圖片描述