如何在Django中debugging,好方法?
所以,我开始学习使用Python和后来的Django进行编码。 第一次很难看回溯,实际上弄清楚我做错了什么,语法错误在哪里。 现在已经过去了一段时间,我想我在debugging我的Django代码的过程中得到了一个例程。 由于这是在我的编码经验的早期完成的,我坐下来,想知道我是如何做到这一点是无效的,可以做得更快。 我通常设法find和纠正我的代码中的错误,但我想知道我应该更快地做到这一点吗?
我通常只使用Django启用时的debugging信息。 当事情最终会按照我的想法结束时,我会用一个语法错误来分解代码stream,然后查看stream中当时的variables,找出代码执行的操作,而不是我想要的。
但是这可以改善吗? 有没有一些好的工具或更好的方法来debugging你的Django代码?
有很多方法可以做到这一点,但最简单的就是简单地使用Pythondebugging器 。 只需将以下代码行添加到Django视图函数中:
import pdb; pdb.set_trace()
如果您尝试在浏览器中加载该页面,则浏览器将挂起,并提示您在实际执行的代码上进行debugging。
但是还有其他的selectbuild议(我不会推荐他们):
* return HttpResponse({variable to inspect}) * print {variable to inspect} * raise Exception({variable to inspect})
但是Pythondebugging器(pdb)强烈build议用于所有types的Python代码。 如果你已经进入了pdb,你也想看看使用ipython进行debugging的IPDB 。 快乐的编码。
Seafangs提供的一个有用的参考: 在Django中使用Pythondebugging器
我真的很喜欢Werkzeug的交互式debugging器。 它类似于Django的debugging页面,只是在traceback的每个级别上都有一个交互式shell。 如果你使用django-extensions ,你会得到一个启动开发服务器的runserver_plus
pipe理命令,并给你Werkzeug的exceptiondebugging器。
当然,你只能在本地运行,因为它给了任何一个有浏览器权限的人在服务器上下文中执行任意的python代码。
模板标签有点快捷:
@register.filter def pdb(element): import pdb; pdb.set_trace() return element
现在,在一个模板中,您可以{{ template_var|pdb }}
并input一个pdb会话(假设您正在运行本地的devel服务器),您可以在其中检查element
到您的心脏的内容。
这是一个非常好的方式来看看你的对象到达模板时发生了什么。
有几个工具配合良好,可以使您的debugging任务更容易。
最重要的是Djangodebugging工具栏 。
那么你需要使用Python 日志logging工具进行良好的日志 您可以将日志输出发送到日志文件,但更简单的选项是将日志输出发送到firepython 。 要使用这个,你需要使用Firebug扩展的Firefox浏览器。 Firepython包含一个Firebug插件,可以在Firebug选项卡中显示任何服务器端日志logging。
萤火虫本身也是debugging你开发的任何应用程序的JavaScript方面的关键。 (假设你有一些JS代码当然)。
我也喜欢用django-viewtools来交互地使用pdb来debugging视图,但是我没有那么用。
还有更多有用的工具,比如推土机,用于追踪内存泄漏(这里还有其他关于内存跟踪的答案)。
我使用PyCharm (与eclipse相同的pydev引擎)。 真的帮助我在视觉上能够通过我的代码,看看发生了什么。
几乎所有东西都已经被提到,所以我只会补充说,不是使用pdb.set_trace() ,而是使用使用iPython的ipdb.set_trace() ,因此function更强大(自动完成和其他好东西)。 这需要ipdb包,所以你只需要pip install ipdb
我把django-pdb
推到了PyPI上 。 这是一个简单的应用程序,这意味着你不需要每次你想闯入pdb时编辑你的源代码。
安装只是…
-
pip install django-pdb
- 将
'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)
并运行: manage.py test --pdb
在testing失败/错误时分解成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)
该项目托pipe在GitHub上 ,当然欢迎贡献。
debuggingpython的最简单的方法是使用PTVS(适用于Visual Studio的Python工具),尤其是用于Visual Studio的程序员。 步骤很简单:
- 从http://pytools.codeplex.com/下载并安装它;
- 设置断点并按F5。
- 您的断点被击中,您可以查看/更改variables像debuggingC#/ C ++程序一样简单。
- 就这样 :)
如果您想使用PTVSdebuggingDjango,则需要执行以下操作:
- 在项目设置 – 常规选项卡中,将“启动文件”设置为“manage.py”,即Django程序的入口点。
- 在Project settings – Debug选项卡中,将“Script Arguments”设置为“runserver –noreload”。 关键是这里“–noreload”。 如果你没有设置它,你的断点不会被击中。
- 好好享受。
我使用Eclipse的pyDev真的很好,设置断点,进入代码,查看任何对象和variables的值,尝试它。
从我的angular度来看,我们可以将通用代码debugging任务分解为三种不同的使用模式:
- 有些事情引发了一个例外 : runserver_plus'Werkzeugdebugging器来救援。 在所有跟踪级别运行自定义代码的能力是一个杀手。 如果你完全陷入困境,你可以创build一个Gist分享点击。
- 页面呈现,但结果是错误的 :再次,Werkzeug岩石。 要在代码中创build断点,只需在要停止的位置键入
assert False
。 - 代码工作不正确 ,但快速查看并没有帮助。 很可能是一个algorithm问题。 叹。 然后我通常会启动一个控制台debugging器PuDB :
import pudb; pudb.set_trace()
import pudb; pudb.set_trace()
。 与[i] pdb相比,主要优点是PuDB(看起来像80年代)使得自定义监视expression式变得轻而易举。 使用GUIdebugging一堆嵌套循环要简单得多。
啊,是的,模板的困境。 最常见(对我和我的同事)的问题是一个错误的上下文:或者你没有variables,或者你的variables没有一些属性。 如果您正在使用debugging工具栏 ,只需在“模板”部分检查上下文,或者如果不足,请在上下文填充之后在视图代码中设置中断。
所以它。
我强烈推荐epdb(扩展Pythondebugging器)。
https://bitbucket.org/dugan/epdb
有一件事我喜欢用于debuggingDjango或其他Pythonnetworking服务器的epdb是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实例,可以指定要侦听的端口(默认为8080)。 即
import epdb; epdb.serve(4242) >> import epdb; epdb.connect(host='192.168.3.2', port=4242)
如果未指定,则主机默认为“localhost”。 我把它扔在这里来演示如何使用它来debugging本地实例以外的东西,比如本地局域网上的开发服务器。 很显然,如果你这样做的话,请注意设置的跟踪不会将其放到生产服务器上!
作为一个简单的说明,你仍然可以像使用epdb( import epdb; epdb.set_trace()
)一样接受答案,但是我想突出显示服务function,因为我发现它非常有用。
有时候我想用特定的方法来探索周围,召唤pdb太繁琐,我会补充一下:
import IPython; IPython.embed()
IPython.embed()
启动一个IPython shell,它可以从你调用它的地方访问局部variables。
我使用PyCharm,并一路支持。 这花了我一点,但我不得不说,我从中得到的好处是无价的。 我尝试从控制台进行debugging,并且给予了很多可以做到这一点的功劳,但对于我来说,能够直观地debugging我的应用程序非常棒。
我不得不说, PyCharm确实占用了很多内存。 但是,再一次,没有什么好事是自由的。 他们刚刚带来了最新的版本3.它也与Django,Flask和Google AppEngine搭配得非常好。 所以,总而言之,我认为这对于任何开发者来说都是一个非常方便的工具。
如果你还没有使用它,我build议30天的试用版来看看PyCharm的强大function。 我确定还有其他工具可用,如Aptana。 但我想我也喜欢PyCharm的样子。 我觉得在那里debugging我的应用非常舒服。
我刚刚发现了wdb( http://www.rkblog.rk.edu.pl/w/p/debugging-python-code-browser-wdb-debugger/?goback=%2Egde_25827_member_255996401 )。 它有一个相当不错的用户界面/ GUI与所有的花里胡哨。 作者说这个关于wdb –
“像PyCharm这样的IDE有它们自己的debugging器,它们提供了类似或相同的function集……但是使用它们,你必须使用那些特定的IDE(其中一些是非自由的,或者可能并不是所有的平台),为您的需求select合适的工具。“
以为我只是把它传递。
另外一个非常有用的文章关于pythondebugging器: https : //zapier.com/engineering/debugging-python-boss/
最后 ,如果你想在Django中看到你的调用堆栈的一个很好的graphics打印输出,请检查: https : //github.com/joerick/pyinstrument 。 只需将pyinstrument.middleware.ProfilerMiddleware添加到MIDDLEWARE_CLASSES,然后将?profile添加到请求URL的末尾以激活分析器。
也可以从命令行或导入模块来运行pyinstrument。
我使用PyCharm和不同的debugging工具。 也有一个很好的文章设置容易为新手设置这些东西。 你可以从这里开始 它通常介绍有关Django项目的PDB和GUIdebugging。 希望有人会从中受益。
如果使用Aptana进行django开发,请观看: http : //www.youtube.com/watch?v = qQh-UQFltJQ
如果不是,请考虑使用它。
大多数选项都是提到的。 为了打印模板上下文,我为此创build了一个简单的库。 请参阅https://github.com/edoburu/django-debugtools
您可以使用它来打印模板上下文,而不需要任何{% load %}
构造:
{% print var %} prints variable {% print %} prints all
它使用定制的pprint格式在<pre>
标签中显示variables。
我喜欢可以直接复制的答案。 我喜欢IPython:
pip install ipdb
在你的代码中:
import ipdb; ipdb.set_trace()
我强烈build议使用PDB。
import pdb pdb.set_trace()
你可以检查所有的variables值,进入function等等。 https://docs.python.org/2/library/pdb.html
为检查所有types的请求,响应和命中数据库。我使用django-debug-toolbar https://github.com/django-debug-toolbar/django-debug-toolbar
正如在这里的其他post中提到的 – 在代码中设置断点,然后遍历代码,看看它是否像您期望的那样工作,这是学习像Django之类的一种很好的方法,直到您对所有的行为有一个很好的理解 – 以及您的代码是在做。
要做到这一点,我会build议使用WingIde。 就像其他提到的IDE一样,它很好用,易于使用,布局漂亮,并且易于设置断点来评估/修改堆栈等。当你逐步浏览代码时,它是完美的。 我是一个很大的粉丝。
另外我使用PyCharm – 它具有出色的静态代码分析function,可以帮助您在发现问题之前发现问题。
如前所述,django-debug-toolbar是必不可less的 – https://github.com/django-debug-toolbar/django-debug-toolbar
虽然没有明确的debugging或分析工具,但我最喜欢的是SQL打印中间件,可从Django Snippets获得, url为https://djangosnippets.org/snippets/290/
这将显示您的视图生成的SQL查询。 这会让你很好的理解ORM在做什么,如果你的查询是有效的,或者你需要重写你的代码(或者添加caching)。
我发现在开发和debugging我的应用程序时,关注查询性能是非常宝贵的。
只是另一个提示 – 我稍微修改它为我自己的使用只显示摘要,而不是SQL语句….所以我总是使用它,而开发和testing。 我还补充说,如果len(connection.queries)大于预先定义的阈值,它会显示一个额外的警告。
然后,如果我发现一些不好的事情(从性能或查询数量的angular度来看)正在发生,我将完全显示SQL语句,以查看到底发生了什么。 在与多个开发人员一起处理大型Django项目时非常方便。
对于那些不小心将pdb添加到实际提交中,我可以build议#Koobz的这个扩展回答:
@register.filter def pdb(element): from django.conf import settings if settings.DEBUG: import pdb pdb.set_trace() return element
添加import pdb; pdb.set_trace()
在Python代码的相应行处inputimport pdb; pdb.set_trace()
并执行它。 执行将会停止在一个交互式shell中。 在shell中,您可以执行Python代码(即打印variables)或使用如下命令:
-
c
继续执行 -
n
在同一个函数内进入下一行 - 在这个函数的下一行或者一个被调用的函数中
- 退出debugging器/执行
另请参阅: https : //poweruser.blog/setting-a-breakpoint-in-python-438e23fe6b28
另外一个build议。
您可以将nosetests和pdb一起使用,而是手动在视图中注入pdb.set_trace()
。 优点是您可以在第一次启动时观察错误情况,可能在第三方代码中。
今天我有一个错误。
TypeError at /db/hcm91dmo/catalog/records/ render_option() argument after * must be a sequence, not int .... Error during template rendering In template /opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/crispy_forms/templates/bootstrap3/field.html, error at line 28 render_option() argument after * must be a sequence, not int 18 19 {% if field|is_checkboxselectmultiple %} 20 {% include 'bootstrap3/layout/checkboxselectmultiple.html' %} 21 {% endif %} 22 23 {% if field|is_radioselect %} 24 {% include 'bootstrap3/layout/radioselect.html' %} 25 {% endif %} 26 27 {% if not field|is_checkboxselectmultiple and not field|is_radioselect %} 28 {% if field|is_checkbox and form_show_labels %}
现在,我知道这意味着我欺骗了表单的构造函数,而且我甚至对哪个字段是一个问题有了很好的认识。 但是,我可以在模板中使用pdb来查看哪些酥脆的表单在抱怨吗?
我可以。 在nosetests上使用–pdb选项:
tests$ nosetests test_urls_catalog.py --pdb
只要我遇到任何exception(包括优雅的处理),pdb停止发生,我可以环顾四周。
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/forms/forms.py", line 537, in __str__ return self.as_widget() File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/forms/forms.py", line 593, in as_widget return force_text(widget.render(name, self.value(), attrs=attrs)) File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/forms/widgets.py", line 513, in render options = self.render_options(choices, [value]) File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/forms/widgets.py", line 543, in render_options output.append(self.render_option(selected_choices, *option)) TypeError: render_option() argument after * must be a sequence, not int INFO lib.capture_middleware log write_to_index(http://localhost:8082/db/hcm91dmo/catalog/records.html) INFO lib.capture_middleware log write_to_index:end > /opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/forms/widgets.py(543)render_options() -> output.append(self.render_option(selected_choices, *option)) (Pdb) import pprint (Pdb) pprint.PrettyPrinter(indent=4).pprint(self) <django.forms.widgets.Select object at 0x115fe7d10> (Pdb) pprint.PrettyPrinter(indent=4).pprint(vars(self)) { 'attrs': { 'class': 'select form-control'}, 'choices': [[('_', 'any type'), (7, (7, 'type 7', 'RECTYPE_TABLE'))]], 'is_required': False} (Pdb)
现在,很明显,我对crispy字段构造函数的select参数是列表中的列表,而不是元组的列表/元组。
'choices': [[('_', 'any type'), (7, (7, 'type 7', 'RECTYPE_TABLE'))]]
整洁的事情是,这个pdb发生在crispy的代码中,而不是我的,我不需要手动插入它。
使用pdb
或ipdb
。 这两者之间的区别在于ipdb支持自动完成。
为pdb
import pdb pdb.set_trace()
为ipdb
import ipdb ipdb.set_trace()
为了执行新的命中键,继续命中c
键。 通过使用help(pdb)
检查更多选项
在开发过程中,添加一个快速
assert False, value
可以帮助诊断视图或其他任何地方的问题,而无需使用debugging器。
我发现Visual Studio Code对于debuggingDjango应用程序非常棒。 标准的python launch.json参数通过附带的debugging器运行python manage.py
,因此您可以设置断点并按照自己的喜好逐步执行代码。
debuggingDjango代码的最佳select之一是通过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服务器来debuggingpython 2程序,或者在第三台计算机上debugging运行在另一台计算机上的另一台计算机上的debugging服务器的计算机上运行的程序! 即使更好,现在可以使用来自Web界面的代码注入来暂停当前正在运行的python进程/线程。 (这需要启用gdb和ptrace)换句话说,它是一个非常强大的pdb版本,可以直接在浏览器中使用,而且function很好。
安装并运行服务器,并在您的代码中添加:
import wdb wdb.set_trace()
根据作者,与pdb
主要区别是:
对于那些不知道这个项目的人来说,wdb是一个像pdb这样的pythondebugging器,但是它有一个漂亮的web前端和许多附加function,例如:
- 源语法突出显示
- 视觉断点
- 使用jedi交互式代码完成
- 持久的断点
- 使用鼠标multithreading/多处理支持深入对象检查
- 远程debugging
- 观看表情
- 在debugging器代码版本中
- stream行的Web服务器集成,以打破错误
- 在跟踪(不是验尸)期间的exception中断与例如werkzeugdebugging器相反
- 通过代码注入打破当前正在运行的程序(在支持的系统上)
它有一个很好的基于浏览器的用户界面。 一个快乐的使用! 🙂