Django 中如何正确调试?
我开始学习编程的时候用的是Python,后来又学了Django。刚开始的时候,看错误信息(tracebacks)真的很难,根本搞不清楚自己哪里出错了,语法错误在哪里。现在过了一段时间,我觉得自己在调试Django代码方面有了一些经验。因为这是我编程初期做的事情,所以我坐下来想,自己这样调试是不是效率不高,能不能更快一些。我通常能找到并修正代码中的错误,但我在想,是否应该更快一些呢?
我一般都是使用Django提供的调试信息,开启后就能看到。当事情没有按照我想的那样进行时,我经常会因为语法错误而中断代码的执行,然后查看那个时刻的变量,试图找出代码为什么没有按照我的预期运行。
但是,这样的方法能改进吗?有没有什么好的工具或者更好的方法来调试我的Django代码呢?
27 个回答
这里有个小技巧关于模板标签:
@register.filter
def pdb(element):
import pdb; pdb.set_trace()
return element
现在,在模板里你可以使用 {{ template_var|pdb }}
,这样就可以进入一个叫做 pdb 的调试模式(前提是你在本地开发服务器上运行),在这个模式里你可以随意查看 element
的内容。
这是一种很好的方法,可以让你看到当对象到达模板时发生了什么。
我非常喜欢Werkzeug的交互式调试器。它和Django的调试页面有点像,不过它在每个错误追踪的层级上都提供了一个可以互动的命令行。如果你使用django-extensions,你可以使用一个叫runserver_plus
的管理命令,这个命令会启动开发服务器,并在出现错误时给你Werkzeug的调试器。
当然,你应该只在本地运行这个,因为它会让任何有浏览器的人都能在服务器的环境中执行任意的Python代码。
有很多方法可以做到这一点,但最简单的就是直接使用 Python 调试器。只需在 Django 的视图函数中添加以下代码:
import pdb; pdb.set_trace()
或者
breakpoint() #from Python3.7
如果你在浏览器中加载那个页面,浏览器会卡住,然后你就可以在实际执行的代码上继续调试。
不过还有其他选择(我不推荐这些):
* return HttpResponse({variable to inspect})
* print {variable to inspect}
* raise Exception({variable to inspect})
但是 Python 调试器(pdb)对于所有类型的 Python 代码都是强烈推荐的。如果你已经在使用 pdb,你可能还想看看 IPDB,它使用 ipython 来进行调试。
一些对 pdb 很有用的扩展包括:
在 Django 中使用 Python 调试器,这是 Seafangs 推荐的。