如何在Django中调试好方法?

goo*_*orp 564 python django debugging

所以,我开始学习用Python和后来的Django编写代码.第一次很难看回溯并实际弄清楚我做错了什么以及语法错误在哪里.现在已经过了一段时间,并且在某种程度上,我想我在调试我的Django代码时有一个例程.由于这是在我的编码经验的早期完成的,我坐下来想知道我是如何做到这一点是无效的,可以更快地完成.我经常设法找到并纠正我的代码中的错误,但我想知道我是否应该更快地做到这一点?

我通常只使用Django启用时提供的调试信息.当事情最终按照我的想法结束时,我会在语法错误的情况下破坏代码流程,并查看流程中该点的变量以找出代码,其中代码执行的操作不是我想要的.

但这可以改善吗?是否有一些好的工具或更好的方法来调试Django代码?

sim*_*rsh 520

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

import pdb; pdb.set_trace()
Run Code Online (Sandbox Code Playgroud)

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

但是还有其他选择(我不推荐它们):

breakpoint()  #from Python3.7
Run Code Online (Sandbox Code Playgroud)

但强烈建议对所有类型的Python代码使用Python调试器(pdb).如果你已经到PDB,你想也想看看IPDB使用IPython中进行调试.

对pdb有一些更有用的扩展

安帕什建议的 pdb ++.

pudb,所建议 PatDuJour.

Seafangs建议在Django中使用Python调试器.

  • +1表示建议pdb.但是值得注意的是,只有在本地计算机上使用开发服务器时才能正常工作,因为提示符将出现在控制台中. (64认同)
  • 另请参阅下面的答案[django-pdb](http://pypi.python.org/pypi/django-pdb).给你`manage.py runserver --pdb`和`manage.py test --pdb`命令. (12认同)
  • 查看[`ipython`](http://ipython.org/index.html).`Ipdb`,它带有`ipython`,具有标签完成,彩色语法等功能:-). (11认同)
  • @Daniel,请参阅[rconsole](http://code.google.com/p/rfoo/),让控制台进入已经运行的python实例. (4认同)
  • 我发现你的答案很有用,但当我试图调试测试时,Django永远挂在我的断点上.所以我查看并找到了一篇帮助我的信息性文章:http://v3.mike.tig.as/blog/2010/09/14/pdb/ (3认同)
  • pdb 很棒,我一直在使用它,但总是存在无意中提交 set_trace 的危险,并且该提交进入 master,这将是一个问题。如果您正在使用 pdb,那么添加一个预提交钩子来阻止包含该导入的提交是一个非常好的主意。 (2认同)

Ben*_*end 225

我非常喜欢Werkzeug的交互式调试器.它与Django的调试页面类似,只是在每个级别的回溯上都有一个交互式shell.如果您使用django-extensions,您将获得一个runserver_plus管理命令,该命令启动开发服务器并为您提供Werkzeug的异常调试器.

当然,您应该只在本地运行它,因为它为任何拥有浏览器的人提供了在服务器上下文中执行任意python代码的权限.

  • 这不会让你逐步完成代码,这是调试的一个重要部分. (14认同)
  • 到目前为止最佳答案!与django调试工具栏一样好,werkzeug调试器胜过它:)和所有这一切最糟糕的事情 - 我现在使用django-extensions大约半年了,之前并不知道runserver_plus的事情...... (10认同)
  • 是否可以在浏览器中显示的交互式控制台中使用制表符完成功能?“ Tab”只是将我们带到下一个打开的控制台,我想知道是否有按键组合,但是我找不到。 (2认同)

Koo*_*obz 161

快速模板标签:

@register.filter 
def pdb(element):
    import pdb; pdb.set_trace()
    return element
Run Code Online (Sandbox Code Playgroud)

现在,在模板中,您可以执行{{ template_var|pdb }}并输入pdb会话(假设您正在运行本地开发服务器),您可以在其中检查element您的内容.

这是一种非常好的方式来查看对象到达模板时发生了什么.


Van*_*ale 82

有一些工具可以很好地协作,可以使您的调试任务更容易.

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

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

Firebug本身对于调试您开发的任何应用程序的Javascript方面也很关键.(假设你当然有一些JS代码).

我也喜欢django-viewtools用于使用pdb以交互方式调试视图,但我没有那么多使用它.

有更多有用的工具,如推土机,用于追踪内存泄漏(在SO的内存跟踪答案中也有其他好的建议).


Pho*_*beB 62

我使用PyCharm(与eclipse相同的pydev引擎).真的帮助我在视觉上能够逐步完成我的代码,看看发生了什么.

  • 值得一提的是,PyCharm使用PyDev调试器来获取信用. (6认同)
  • 最好的是,它可以正常工作并且完全直观。只需单击一行的左侧,然后单击调试按钮。如果您想更好地了解内部代码的工作原理,那么它也适用于Django源代码。我花了一段时间才注意到它,但是您可以在文件导航器的“外部库”文件夹中的任何代码中放置断点。 (2认同)

Tom*_*ski 43

到目前为止几乎所有内容都已被提及,所以我只会添加,而不是pdb.set_trace()一个可以使用ipdb.set_trace()使用iPython,因此更强大(自动完成和其他好东西).这需要ipdb包,所以你只需要pip install ipdb

  • 我建议使用pdb ++,它提供了非常有用的粘滞模式。 (2认同)

Tom*_*tie 33

我已经推django-pdb到了PyPI.这是一个简单的应用程序,这意味着每次要打破pdb时都不需要编辑源代码.

安装只是......

  1. pip install django-pdb
  2. 加入'django_pdb'你的INSTALLED_APPS

您现在可以运行:manage.py runserver --pdb在每个视图的开头闯入pdb ...

bash: manage.py runserver --pdb
Validating models...

0 errors found
Django version 1.3, using settings 'testproject.settings'
Development server is running at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

GET /
function "myview" in testapp/views.py:6
args: ()
kwargs: {}

> /Users/tom/github/django-pdb/testproject/testapp/views.py(7)myview()
-> a = 1
(Pdb)
Run Code Online (Sandbox Code Playgroud)

并运行:manage.py test --pdb在测试失败/错误时闯入pdb ...

bash: manage.py test testapp --pdb
Creating test database for alias 'default'...
E
======================================================================
>>> test_error (testapp.tests.SimpleTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File ".../django-pdb/testproject/testapp/tests.py", line 16, in test_error
    one_plus_one = four
NameError: global name 'four' is not defined
======================================================================

> /Users/tom/github/django-pdb/testproject/testapp/tests.py(16)test_error()
-> one_plus_one = four
(Pdb)
Run Code Online (Sandbox Code Playgroud)

该项目在GitHub上主持,当然欢迎贡献.

  • 如果您可以指定要中断的文件/行号(不仅仅是视图),这将是很好的. (3认同)

小智 21

调试python的最简单方法 - 特别是对于习惯于Visual Studio的程序员 - 使用的是PTVS(Visual Studio的Python工具).步骤很简单:

  1. http://pytools.codeplex.com/下载并安装
  2. 设置断点并按F5.
  3. 您的断点被点击,您可以像调试C#/ C++程序一样轻松查看/更改变量.
  4. 就这样 :)

如果要使用PTVS调试Django,则需要执行以下操作:

  1. 在项目设置 - 常规选项卡中,将"启动文件"设置为"manage.py",这是Django程序的入口点.
  2. 在项目设置 - 调试选项卡中,将"脚本参数"设置为"runserver --noreload".关键点在于"--noreload".如果您没有设置它,您的断点将不会被击中.
  3. 好好享受.


gat*_*ath 16

我在Eclipse中使用pyDev非常好,设置断点,步入代码,查看任何对象和变量的值,尝试一下.

  • PyDev的远程调试器与Django的dev服务器非常相似.只要确保你有"文件何时更改,自动重装模块?" PyDev的运行/调试设置中的选项''禁用''.否则,dev服务器和pydev都会在你调试时尝试重新加载代码,这会让他们非常困惑. (2认同)

小智 12

我使用PyCharm并一直支持它.它花了我一点但我不得不说我摆脱它的优势是无价的.我尝试从控制台调试,我确实给了很多人可以做到这一点的功劳,但对我来说,能够直观地调试我的应用程序是很棒的.

我不得不说,PyCharm确实占用了很多内存.但话说回来,生活中没有任何好处是免费的.他们刚刚推出了最新版本3.它还与Django,Flask和Google AppEngine配合得很好.总而言之,我认为这对任何开发人员来说都是一个非常方便的工具.

如果您还没有使用它,我建议您试用30天的试用版来了解PyCharm的强大功能.我确信还有其他工具可供选择,例如Aptana.但我想我也喜欢PyCharm的样子.我觉得在那里调试我的应用程序很舒服.


Lie*_*yan 10

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

import IPython; IPython.embed()
Run Code Online (Sandbox Code Playgroud)

IPython.embed() 启动一个IPython shell,它可以从您调用它的位置访问本地变量.


Ale*_*zov 9

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

  1. 有些事情引发了一个例外:runserver_plus'Werkzeug调试器来救援.在所有跟踪级别运行自定义代码的能力是一个杀手.如果你完全陷入困境,只需点击一下即可创建一个Gist.
  2. 页面被渲染,但结果是错误的:再次,Werkzeug摇滚.要在代码中创建断点,只需键入assert False要停止的位置即可.
  3. 代码工作错误,但快速查看无济于事.最有可能的是算法问题.叹.然后我通常会启动一个控制台调试器PuDB : import pudb; pudb.set_trace(). 与[i] pdb相比的主要优点是PuDB(看起来像80年代一样)使得设置自定义手表表达变得轻而易举.使用GUI,调试一堆嵌套循环要简单得多.

啊,是的,模板的困境.最常见的(对我和我的同事)问题是错误的上下文:要么您没有变量,要么您的变量没有某些属性.如果您正在使用调试工具栏,只需检查"模板"部分的上下文,或者,如果还不够,请在填写上下文后立即在视图代码中设置中断.

就这样吧.


Chr*_*ris 9

在 Python 代码的对应行添加import pdb; pdb.set_trace()or breakpoint() (form python3.7)并执行。执行将通过交互式 shell 停止。在 shell 中,您可以执行 Python 代码(即打印变量)或使用以下命令:

  • c 继续执行
  • n 转到同一函数中的下一行
  • s 跳到此函数或被调用函数的下一行
  • q 退出调试器/执行

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


Jac*_*nda 6

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

https://bitbucket.org/dugan/epdb

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

我认为我想逐步完成.我将在我想要设置跟踪的位置插入以下内容.

import epdb; epdb.serve()
Run Code Online (Sandbox Code Playgroud)

执行此代码后,我打开一个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
Run Code Online (Sandbox Code Playgroud)

您可以随时了解有关键入epdb帮助的更多信息.

如果要同时提供或连接到多个epdb实例,可以指定要侦听的端口(默认为8080).即

import epdb; epdb.serve(4242)

>> import epdb; epdb.connect(host='192.168.3.2', port=4242)
Run Code Online (Sandbox Code Playgroud)

如果未指定,则host默认为"localhost".我把它扔到这里来演示如何使用它来调试除本地实例之外的其他东西,比如本地LAN上的开发服务器.显然,如果你这样做,请注意设置的跟踪永远不会进入你的生产服务器!

作为一个快速说明,您仍然可以使用epdb(import epdb; epdb.set_trace())接受的答案做同样的事情,但我想强调服务功能,因为我发现它非常有用.


Hut*_*tch 6

我刚刚找到了wdb(http://www.rkblog.rk.edu.pl/w/p/debugging-python-code-browser-wdb-debugger/?goback=%2Egde_25827_member_255996401).它有一个非常好的用户界面/ GUI,所有的铃声和​​口哨声.作者说这关于wdb -

"像PyCharm这样的IDE都有自己的调试器.它们提供类似或相同的功能集......但是要使用它们,你必须使用那些特定的IDE(其中一些是非免费的,或者可能并非全部可用平台).根据您的需求选择合适的工具."

以为我只是传递它.

关于python调试器的一篇非常有用的文章: https ://zapier.com/engineering/debugging-python-boss/

最后,如果你想在Django中看到你的调用堆栈的精美图形打印输出,请访问:https: //github.com/joerick/pyinstrument.只需将pyinstrument.middleware.ProfilerMiddleware添加到MIDDLEWARE_CLASSES,然后将?profile添加到请求URL的末尾以激活探查器.

也可以从命令行运行pyinstrument或作为模块导入.


fes*_*tto 5

调试 Django 代码的最佳选择之一是通过 wdb:https : //github.com/Kozea/wdb

wdb 适用于 python 2 (2.6, 2.7), python 3 (3.2, 3.3, 3.4, 3.5) 和 pypy。更好的是,可以使用在 python 3 上运行的 wdb 服务器来调试 python 2 程序,反之亦然,或者使用在第三台计算机上的网页内的另一台计算机上运行的调试服务器来调试在计算机上运行的程序!更好的是,现在可以使用来自 Web 界面的代码注入来暂停当前正在运行的 Python 进程/线程。(这需要启用 gdb 和 ptrace)换句话说,它是直接在浏览器中使用的非常增强的 pdb 版本,具有很好的功能。

安装并运行服务器,并在您的代码中添加:

import wdb
wdb.set_trace()
Run Code Online (Sandbox Code Playgroud)

据作者介绍,主要区别在于pdb

对于那些不了解该项目的人来说,wdb 是一个类似于 pdb 的 Python 调试器,但具有流畅的 Web 前端和许多附加功能,例如:

  • 源语法高亮
  • 视觉断点
  • 使用 jedi 的交互式代码完成
  • 持久断点
  • 使用鼠标多线程/多处理支持进行深度对象检查
  • 远程调试
  • 观看表情
  • 在调试器代码版本中
  • 流行的 Web 服务器集成以在错误时中断
  • 例如,在与 werkzeug 调试器相反的跟踪期间(不是事后分析)中的异常中断
  • 通过代码注入(在支持的系统上)中断当前正在运行的程序

它有一个很棒的基于浏览器的用户界面。使用愉快!:)