So, I started learning to code in Python and later Django. The first times it was hard looking at tracebacks and actually figure out what I did wrong and where the syntax error was. Some time has passed now and some way along the way, I guess I got a routine in debugging my Django code. As this was done early in my coding experience, I sat down and wondered if how I was doing this was ineffective and could be done faster. I usually manage to find and correct the bugs in my code, but I wonder if I should be doing it faster?

我通常只使用Django启用时提供的调试信息。当事情确实像我想象的那样结束时,我用一个语法错误破坏了代码流,并查看流中那个点的变量,以找出代码在哪里做了与我想要的不同的事情。

但这种情况还能改善吗?是否有一些更好的工具或方法来调试Django代码?


当前回答

大多数选项都已经提到了。 为了打印模板上下文,我为此创建了一个简单的库。 参见https://github.com/edoburu/django-debugtools

你可以使用它来打印模板上下文,而不需要任何{% load %}结构:

{% print var %}   prints variable
{% print %}       prints all

它使用定制的pprint格式在<pre>标记中显示变量。

其他回答

有很多方法可以做到这一点,但最直接的是简单 使用Python调试器。只需在Django视图函数中添加如下一行:

import pdb; pdb.set_trace()

or

breakpoint()  #from Python3.7

如果您试图在浏览器中加载该页,浏览器将挂起,并提示您对实际执行的代码进行调试。

但是也有其他的选择(我不推荐):

* return HttpResponse({variable to inspect})

* print {variable to inspect}

* raise Exception({variable to inspect})

但是对于所有类型的Python代码,强烈推荐使用Python调试器(pdb)。如果您已经开始使用pdb,那么您还需要了解使用ipython进行调试的IPDB。

对pdb有一些更有用的扩展

pdb++,由Antash建议。

pudb,由PatDuJour建议。

在Django中使用Python调试器,由Seafangs建议。

从我自己的经验来看,有两种方法:

使用ipdb,这是一个像pdb一样的增强调试器。 导入ipdb;ipdb.set_trace()或breakpoint() (from python3.7) 使用django shell,只需使用下面的命令。这在您开发新视图时非常有用。 Python manage.py shell

我强烈建议使用PDB。

import pdb
pdb.set_trace()

您可以检查所有变量值,进入函数和更多。 https://docs.python.org/2/library/pdb.html

用于检查对数据库的各种请求、响应和命中。我正在使用django-debug-toolbar https://github.com/django-debug-toolbar/django-debug-toolbar

我非常喜欢Werkzeug的交互式调试器。它类似于Django的调试页面,除了在回溯的每一层都有一个交互式shell。如果你使用django-extensions,你会得到一个runserver_plus管理命令,它会启动开发服务器,并在异常时为你提供Werkzeug的调试器。

当然,您应该只在本地运行它,因为它赋予任何使用浏览器的人在服务器上下文中执行任意python代码的权利。

添加导入pdb;pdb.set_trace()或breakpoint()(形式python3.7)在Python代码中的相应行中执行。执行将在交互式shell中停止。在shell中,您可以执行Python代码(即打印变量)或使用如下命令:

C继续执行 N步到同一函数中的下一行 S步到这个函数或被调用函数的下一行 Q退出调试器/执行

参见:https://poweruser.blog/setting-a-breakpoint-in-python-438e23fe6b28