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


当前回答

我强烈推荐epdb(扩展Python调试器)。

https://bitbucket.org/dugan/epdb

我喜欢用epdb来调试Django或其他Python web服务器的一个原因是epdb.serve()命令。这将设置跟踪,并在您可以连接到的本地端口上提供该跟踪。典型用例:

我有一个视图,我想一步一步地讲。我将在我想要设置跟踪的位置插入以下内容。

import epdb; epdb.serve()

一旦执行了这段代码,我打开一个Python解释器并连接到服务实例。我可以分析所有的值,并使用标准pdb命令(如n, s等)逐级遍历代码。

In [2]: import epdb; epdb.connect()
(Epdb) request
<WSGIRequest
path:/foo,
GET:<QueryDict: {}>, 
POST:<QuestDict: {}>,
...
>
(Epdb) request.session.session_key
'i31kq7lljj3up5v7hbw9cff0rga2vlq5'
(Epdb) list
 85         raise some_error.CustomError()
 86 
 87     # Example login view
 88     def login(request, username, password):
 89         import epdb; epdb.serve()
 90  ->     return my_login_method(username, password)
 91
 92     # Example view to show session key
 93     def get_session_key(request):
 94         return request.session.session_key
 95

您可以在任何时候了解更多关于输入epdb帮助的信息。

如果希望同时为多个epdb实例提供服务或连接到多个epdb实例,可以指定监听的端口(默认为8080)。即。

import epdb; epdb.serve(4242)

>> import epdb; epdb.connect(host='192.168.3.2', port=4242)

如果没有指定,主机默认为'localhost'。我在这里介绍它是为了演示如何使用它来调试本地实例以外的东西,比如本地LAN上的开发服务器。显然,如果您这样做,请注意设置跟踪永远不会出现在您的生产服务器上!

作为一个快速提示,您仍然可以使用epdb执行与接受的答案相同的操作(import epdb;epdb.set_trace()),但我想强调一下服务功能,因为我发现它非常有用。

其他回答

我强烈建议使用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

有很多方法可以做到这一点,但最直接的是简单 使用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建议。

有时,当我想在一个特定的方法中探索,而召唤pdb太麻烦时,我会补充:

import IPython; IPython.embed()

IPython.embed()会启动一个IPython shell,它可以从你调用它的地方访问局部变量。

从我的角度来看,我们可以将常见的代码调试任务分解为三种不同的使用模式:

Something has raised an exception: runserver_plus' Werkzeug debugger to the rescue. The ability to run custom code at all the trace levels is a killer. And if you're completely stuck, you can create a Gist to share with just a click. Page is rendered, but the result is wrong: again, Werkzeug rocks. To make a breakpoint in code, just type assert False in the place you want to stop at. Code works wrong, but the quick look doesn't help. Most probably, an algorithmic problem. Sigh. Then I usually fire up a console debugger PuDB: import pudb; pudb.set_trace(). The main advantage over [i]pdb is that PuDB (while looking as you're in 80's) makes setting custom watch expressions a breeze. And debugging a bunch of nested loops is much simpler with a GUI.

啊,是的,模板的问题。最常见的问题(对我和我的同事来说)是错误的上下文:要么你没有变量,要么你的变量没有某些属性。如果你正在使用调试工具栏,只检查“模板”部分的上下文,或者,如果这还不够,在你的上下文填充后,在视图的代码中设置一个断点。

就这样。

我使用pyDev与Eclipse真的很好,设置断点,进入代码,查看任何对象和变量的值,尝试它。