使用 Python 偵錯程式(Pdb)

最基本的 Django 除錯工具是 pdb ,它是 Python 標準庫的一部分。

初始化檢視指令碼

我們來看一個簡單的 views.py 指令碼:

from django.http import HttpResponse

def index(request):
    foo = 1
    bar = 0

    bug = foo/bar

    return HttpResponse("%d goes here." % bug)

用於執行伺服器的 Console 命令:

python manage.py runserver

很明顯,當你嘗試載入索引頁面時,Django 會丟擲一個 ZeroDivisionError,但是如果我們假裝程式碼中的 bug 很深,那麼它可能會變得非常討厭。

設定斷點

幸運的是,我們可以設定斷點來追蹤該錯誤:

from django.http import HttpResponse

# Pdb import
import pdb

def index(request):
    foo = 1
    bar = 0
    
    # This is our new breakpoint
    pdb.set_trace()
    
    bug = foo/bar
    
    return HttpResponse("%d goes here." % bug)

使用 pdb 執行伺服器的控制檯命令:

python -m pdb manage.py runserver

現在頁面載入斷點將在 shell 中觸發(Pdb)提示,這也會使瀏覽器掛起處於掛起狀態。

使用 pdb shell 進行除錯

是時候通過 shell 與指令碼互動除錯該檢視了:

> ../views.py(12)index()
-> bug = foo/bar
# input 'foo/bar' expression to see division results:
(Pdb) foo/bar
*** ZeroDivisionError: division by zero
# input variables names to check their values:
(Pdb) foo
1
(Pdb) bar
0
# 'bar' is a source of the problem, so if we set it's value > 0...
(Pdb) bar = 1
(Pdb) foo/bar
1.0
# exception gone, ask pdb to continue execution by typing 'c':
(Pdb) c
[03/Aug/2016 10:50:45] "GET / HTTP/1.1" 200 111

在最後一行中,我們看到我們的檢視返回了一個 OK 響應並按預期執行。

要停止 pdb 迴圈,只需在 shell 中輸入 q 即可。