使用 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 即可。