python - django 如何调试?

  显示原文与译文双语对照的内容

所以,我开始学习 pythonDjango的代码。 第一次查看tracebacks时,发现我做了什么错误和语法错误。 一些时间已经过去了,而且一路上有一些方法,我想我得到了调试我的Django代码的例程。 因为这是在我的编码经验早期完成的,所以我坐下并想知道我是如何做到这一点的,并且可以更快的完成。 我通常在代码中找到并更正 Bug,但我想知道是否应该更快地做?

我通常只在启用时使用调试信息 Django 。 当事情做最终认为它会我打破代码流了很多语法错误,看着在这一点中流弄清,哪里不想要的什么代码的变量。

但这能否改进? 是否有一些好工具或者更好的方法来调试Django代码?

时间:

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


import pdb; pdb.set_trace()

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

但是其他的( 我不推荐他们) 建议有其他选项:


* return HttpResponse({variable to inspect})

* print {variable to inspect}

* raise Exception({variable to inspect})

但是 python 调试器( pdb ) 对于所有类型的python 代码都是强烈推荐的。 如果你已经到pdb,你也想看看 IPDB 使用 ipython 进行调试。 开心编码。

Seafangs 提供了一个有用的参考: 使用Django编辑器中的python 调试器

我真的喜欢 Werkzeug的调试器交互。 它类似于django页面的调试,只不过你在回溯的每一层都得到了一个交互的外壳。 如果你使用 django-extensions,你会得到一个 runserver_plus 管理命令,它启动开发服务器,并为你提供werkzeug的调试器。

当然,你应该只在本地运行它,因为它给任何人提供了在服务器上下文中执行任意 python 代码的权限。

对于模板标记,稍微快速一点:


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

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

当你的对象到达模板时,它是一个非常好的方法。

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

最重要的是 Django调试工具栏

然后,你需要使用 python 日志服务器工具进行日志记录。 你可以将日志输出发送到日志文件,但更简单的选项是将日志输出发送到 firepython web 。 要使用这个,你需要使用 Firefox 浏览器和 firebug 扩展。 Firepython包括一个Firebug插件,它将在Firebug选项卡中显示任何server-side日志。

Firebug本身对于调试你开发的任何应用程序的Javascript端也非常重要。 ( 假设你有一些JS代码) 。

我也喜欢 django-viewtools 使用pdb交互式地调试视图,但我并没有使用它。

还有更多有用的工具,如推土机,用来跟踪内存泄漏( 对于内存跟踪,在这里给出了其他一些不错的建议) 。

几乎所有被提到了到目前为止,我只会增加,而不是 pdb.set_trace() 可以使用 ipdb.set_trace() ( 自动完成和其他工具) 使用ipython,因此更强大。 这需要ipdb软件包,所以你只需要 easy_install ipdb

我已经将 django-pdb 推送到映射中。 这是一个简单的应用,意味着你不需要在每次你想打断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)

并运行: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)

托管在 GitHub上的项目,当然欢迎使用。

有时当我探索在一个特定的方法和召唤pdb太麻烦,我想添加:


import IPython; IPython.embed()

IPython.embed() 启动一个可以访问本地变量的IPython shell 。

...