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代码?


当前回答

有一些工具配合得很好,可以使您的调试任务更容易。

最重要的是Django调试工具栏。

然后需要使用Python日志工具进行良好的日志记录。您可以将日志输出发送到日志文件,但更简单的选择是将日志输出发送到firepython。要使用此功能,您需要使用带有firebug扩展的Firefox浏览器。Firepython包含一个firebug插件,可以在firebug选项卡中显示任何服务器端日志记录。

Firebug本身对于调试您所开发的任何应用程序的Javascript方面也很重要。(当然前提是你有一些JS代码)。

我也喜欢django-viewtools,它可以用pdb交互地调试视图,但是我不怎么用它。

还有更有用的工具,如dozer,可以跟踪内存泄漏(在SO的回答中也有其他关于内存跟踪的好建议)。

其他回答

一个关于模板标签的小窍门:

@register.filter 
def pdb(element):
    import pdb; pdb.set_trace()
    return element

现在,在模板中,您可以执行{{template_var|pdb}}并进入pdb会话(假设您正在运行本地devel服务器),在那里您可以检查元素到您的心的内容。

这是一种很好的方式,可以看到当对象到达模板时发生了什么。

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

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

调试python的最简单的方法——尤其是对习惯于Visual Studio的程序员来说——是使用PTVS (python Tools for Visual Studio)。 步骤很简单:

从https://microsoft.github.io/PTVS/下载并安装它 设置断点并按F5。 您的断点被击中,您可以查看/更改变量,就像调试c# / c++程序一样简单。 这就是全部:)

如果你想使用PTVS调试Django,你需要做以下事情:

在Project settings - General选项卡中,将“Startup File”设置为“manage.py”,这是Django程序的入口点。 在“项目设置-调试”选项卡中,将“脚本参数”设置为“runserver—noreload”。这里的关键点是“—noreload”。如果你不设置它,你的断点就不会被击中。 享受它。

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

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

正如在其他文章中提到的,在你的代码中设置断点,然后遍历代码,看看它是否像你预期的那样运行,这是学习像Django这样的东西的好方法,直到你对它的所有行为以及你的代码在做什么有很好的感觉。

要做到这一点,我建议使用WingIde。就像其他提到的ide一样,很好很容易使用,布局很好,也很容易设置断点,计算/修改堆栈等。完美的可视化你的代码正在做什么,因为你逐步通过它。我是它的超级粉丝。

我还使用PyCharm——它有出色的静态代码分析,有时可以帮助你在意识到问题之前发现问题。

如前所述,django-debug-toolbar是必不可少的- https://github.com/django-debug-toolbar/django-debug-toolbar

虽然不是一个明确的调试或分析工具,但我最喜欢的一个是SQL打印中间件,可以从Django Snippets (https://djangosnippets.org/snippets/290/)上获得

这将显示视图生成的SQL查询。这将使您很好地了解ORM正在做什么,以及您的查询是否有效,或者您是否需要重做代码(或添加缓存)。

我发现它对于在开发和调试应用程序时监视查询性能非常有用。

还有一个技巧——我为自己的使用对它进行了稍微修改,只显示摘要而不显示SQL语句....所以我总是在开发和测试时使用它。我还补充说,如果len(connection.queries)大于预定义的阈值,它会显示一个额外的警告。

然后,如果我发现发生了一些不好的事情(从性能或查询数量的角度来看),我会返回SQL语句的完整显示,以查看到底发生了什么。当你与多个开发人员一起开发一个大型Django项目时,这非常方便。