如何在Django中调试,好方法? [关闭]
Posted
技术标签:
【中文标题】如何在Django中调试,好方法? [关闭]【英文标题】:How to debug in Django, the good way? [closed] 【发布时间】:2010-11-10 05:32:21 【问题描述】:所以,我开始在Python 和后来的Django 中学习编码。第一次很难查看回溯并实际上找出我做错了什么以及语法错误在哪里。现在已经过去了一段时间,在此过程中,我想我在调试我的 Django 代码时得到了一个例程。由于这是在我的编码经验早期完成的,所以我坐下来想知道我是如何做到这一点的是无效的,并且可以更快地完成。我通常会设法找到并纠正我的代码中的错误,但我想知道我是否应该更快地做到这一点?
我通常只使用 Django 在启用时提供的调试信息。当事情真的像我想的那样结束时,我会因语法错误而破坏代码流,并查看流中该点的变量以找出代码在哪里做了我想要的以外的事情。
但这可以改进吗?有没有什么好的工具或者更好的方法来调试你的 Django 代码?
【问题讨论】:
我喜欢用 django-debug-toolbar,非常好用 或者使用 Visual Studio Code 内置的 Python 调试器,如此处所述 code.visualstudio.com/docs/python/tutorial-django 【参考方案1】:有很多方法可以做到这一点,但最简单的是 使用Python debugger。只需在 Django 视图函数中添加以下行:
import pdb; pdb.set_trace()
或
breakpoint() #from Python3.7
如果您尝试在浏览器中加载该页面,浏览器将挂起,并提示您对实际执行的代码进行调试。
但是还有其他选择(我不推荐):
* return HttpResponse(variable to inspect)
* print variable to inspect
* raise Exception(variable to inspect)
但强烈建议将 Python 调试器 (pdb) 用于所有类型的 Python 代码。如果您已经进入 pdb,您还想看看使用ipython 进行调试的IPDB。
一些更有用的 pdb 扩展是
pdb++,由Antash建议。
pudb,由PatDuJour建议。
Using the Python debugger in Django,Seafangs 建议。
【讨论】:
+1 用于建议 pdb。但是值得注意的是,这只有在本地机器上使用开发服务器时才真正有效,因为提示会出现在控制台中。 根据我在下面的回答另见django-pdb。为您提供manage.py runserver --pdb
和manage.py test --pdb
命令。
@Daniel,请参阅 rconsole 以将控制台插入已运行的 python 实例。
也可以查看ipython
。 Ipdb
,与 ipython
一起提供,具有制表符补全、彩色语法等功能:-)。
我发现您的答案很有用,但是当我尝试调试测试时,Django 一直挂在我的断点上。所以我查看并找到了一篇帮助我的内容丰富的文章:v3.mike.tig.as/blog/2010/09/14/pdb【参考方案2】:
我真的很喜欢Werkzeug 的交互式调试器。它类似于 Django 的调试页面,不同之处在于您在回溯的每个级别上都获得了一个交互式 shell。如果您使用django-extensions,您将获得一个runserver_plus
管理命令,该命令将启动开发服务器并为您提供 Werkzeug 的异常调试器。
当然,你应该只在本地运行它,因为它让任何拥有浏览器的人都有权在服务器上下文中执行任意 python 代码。
【讨论】:
是否可以在浏览器显示的交互式控制台中使用 tab 补全? “Tab”只是将我们带到下一个打开的控制台,我想知道是否有组合键,但我找不到。 @Ariel werkzeug 调试器没有制表符补全功能。 如果您正在调试 API,您可以尝试使用 django-rundbg,它为 Werkzeug 调试器增加了一点点。 只到python 3.3
不支持频道github.com/pallets/werkzeug/issues/1322【参考方案3】:
模板标签的小技巧:
@register.filter
def pdb(element):
import pdb; pdb.set_trace()
return element
现在,在模板中,您可以执行 template_var|pdb
并进入一个 pdb 会话(假设您正在运行本地开发服务器),您可以在其中检查 element
的内容。
这是查看对象到达模板时发生了什么情况的一种非常好的方法。
【讨论】:
这很棒。如果您遇到模板问题,您可以做的另一件事是切换到 jinja2(通过棺材加载) - 它是 django 模板的扩展,我认为这是一个改进。它还比 django 更好地将模板和模板继承集成到回溯框架中。 这很可爱。不幸的是,很难找到一种干净的方式将其集成到拒绝任何提交(包括导入 pdb)的代码库中。【参考方案4】:有一些工具配合得很好,可以让您的调试任务更轻松。
最重要的是Django debug toolbar。
那么您需要使用 Python logging 工具进行良好的日志记录。您可以将日志输出发送到日志文件,但更简单的选择是将日志输出发送到firepython。要使用它,您需要使用带有 firebug 扩展名的 Firefox 浏览器。 Firepython 包含一个 firebug 插件,它将在 Firebug 选项卡中显示任何服务器端日志记录。
Firebug 本身对于调试您开发的任何应用的 javascript 端也很重要。 (当然假设你有一些 JS 代码)。
我也喜欢 django-viewtools 使用 pdb 交互式地调试视图,但我用得不多。
有更多有用的工具,例如 dozer 用于跟踪内存泄漏(在 SO 的答案中也有其他很好的建议,用于内存跟踪)。
【讨论】:
【参考方案5】:我使用PyCharm(与 eclipse 相同的 pydev 引擎)。确实有助于我直观地浏览我的代码并查看发生了什么。
【讨论】:
最好的一点是它可以工作并且完全直观。只需单击一行的左侧并点击调试按钮。如果您想更好地了解内部代码的工作原理,它也适用于 Django 源代码。我花了一段时间才注意到它,但是您可以在文件导航器的 External Libraries 文件夹中的任何代码中放置断点。 值得一提的是,PyCharm 在后台使用 PyDev 调试器来获得积分。 ***.com/a/28256637/4366229 除了坏了!最新的稳定版本在初始化后不会在断点处停止;总 POS。 PyCharm 或 (django-)pdb 真的很好。重点是找到可用的映射和断点。我想在本地 curl 调用中调试基于 docker 的 Django,例如“curl localhost:8080/api....”——捕捉这个调用并非易事。但最后成功了。棘手的一点是,不将断点放入应用程序代码中,而是放入 django 核心代码(如 wsgi.py 或 rest_framework/viewsets.py)中很有用。为此,需要一个良好的映射,但在 PyCharm Professional 中它是半自动的。最后,您可以看到序列化程序、查询等任何内容。 porgeto.hu/Py.png【参考方案6】:到目前为止,几乎所有内容都已提及,所以我只补充一点,可以使用 ipdb.set_trace() 代替 pdb.set_trace()
,它使用 iPython,因此更强大(自动完成和其他好东西)。这个需要ipdb包,所以你只需要pip install ipdb
【讨论】:
我推荐 pdb++,它提供了一个非常有用的粘性模式。【参考方案7】:我已将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
在测试失败/错误时闯入 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,当然欢迎投稿。
【讨论】:
如果您可以指定要中断的文件/行号(不仅仅是视图),那就太好了。 我可以将其留在代码中,例如在生产中惰性的 cmets。也许这是一个糟糕的范式,但如果有效地剥离和应用中断会很好。 我最近安装了这个,但直到今天才想出在我的开发设置中配置“POST_MORTEM=True”,正如 Tom 的 django-pdb 所记录的那样。现在我可以随波逐流,当事情变糟时,我会被直接送到问题所在的位置。谢谢汤姆!【参考方案8】:调试 python 的最简单方法 - 特别是对于习惯于 Visual Studio 的程序员 - 是使用 PTVS(Visual Studio 的 Python 工具)。 步骤很简单:
-
从https://microsoft.github.io/PTVS/下载安装
设置断点并按 F5。
您的断点被命中,您可以像调试 C#/C++ 程序一样简单地查看/更改变量。
就是这样:)
如果要使用 PTVS 调试 Django,需要执行以下操作:
-
在项目设置 - 常规选项卡中,将“启动文件”设置为 Django 程序的入口点“manage.py”。
在项目设置 - 调试选项卡中,将“脚本参数”设置为“runserver --noreload”。关键是这里的“--noreload”。如果你不设置它,你的断点将不会被命中。
尽情享受吧。
【讨论】:
谢谢,效果很好。 --noreload 正是我们所需要的 是否有在远程服务器上调试的功能 - 类似于我目前使用的 Eclipse PyDev? 我遇到了这个问题。我按照您的步骤操作,但仍然无法正常工作。它只在 *.py 文件的断点处停止,而不是在 *.html 文件的断点处。【参考方案9】:我在 Eclipse 中使用 pyDev 非常好,设置断点,单步执行代码,查看任何对象和变量的值,试试吧。
【讨论】:
您必须通过 eclipse 运行开发服务器(为了省力的调试体验)。 PyDev 声称具有远程调试功能,但从未使用过它,我无法真正谈论开发体验的质量。详情:pydev.org/manual_adv_remote_debugger.html PyDev 的远程调试器与 Django 的开发服务器配合得非常好。只需确保您有“当文件更改时,自动重新加载模块?” PyDev 的运行/调试设置中的选项“禁用”。否则,开发服务器和 pydev 都会在你调试时尝试重新加载代码,这让他们都非常困惑。【参考方案10】:我使用PyCharm 并一直支持它。它花了我一点钱,但我不得不说我从中获得的优势是无价的。我尝试从控制台进行调试,我确实给了可以做到这一点的人很多功劳,但对我来说,能够直观地调试我的应用程序非常棒。
我不得不说,PyCharm 确实占用了大量内存。但话又说回来,生活中没有什么好事是免费的。他们刚刚推出了最新版本 3。它也与 Django、Flask 和 Google AppEngine 配合得很好。所以,总而言之,我会说它对于任何开发人员来说都是一个非常方便的工具。
如果您还没有使用它,我建议您获得 30 天的试用版,以了解 PyCharm 的强大功能。我确信还有其他可用的工具,例如 Aptana。但我想我也喜欢 PyCharm 的外观。我觉得在那里调试我的应用程序很舒服。
【讨论】:
这可能是我买的第一个 IDE。在 VM 中调试项目听起来像是值得花钱的魔法。【参考方案11】:有时候我想用一种特定的方法去探索,而召唤pdb实在是太麻烦了,我会补充一下:
import IPython; IPython.embed()
IPython.embed()
启动一个 IPython shell,它可以从您调用它的位置访问局部变量。
【讨论】:
我现在已经养成了在文件顶部from IPython import embed
执行此操作的习惯,然后每当我想在代码中快速添加断点时,我都会写embed()
。节省时间。为了避免永远陷入循环,我这样做embed();exit();
@MayankJaiswal:我在 Vim 上有一个键映射,可以将这个 sn-p(以及 JavaScript 中 pudb
和 debugger;
的类似 sn-ps)插入到我正在编辑的文件中。完成后,我只需dd
(删除整行)即可删除断点。这避免了将调试器导入行提交到版本控制或必须先在文件顶部预设导入的风险。【参考方案12】:
在我看来,我们可以将常见的代码调试任务分解为三种不同的使用模式:
-
某事引发了异常:runserver_plus' Werkzeug 调试器进行救援。在所有跟踪级别运行自定义代码的能力是一个杀手锏。如果您完全陷入困境,只需单击一下即可创建 Gist 进行分享。
页面已渲染,但结果错误:Werkzeug 再次出现问题。要在代码中设置断点,只需在要停止的地方输入
assert False
。
代码运行错误,但快速查看并没有帮助。很可能是算法问题。叹。然后我通常会启动一个控制台调试器PuDB:import pudb; pudb.set_trace()
。与 [i]pdb 相比的主要优势在于 PuDB(看起来像 80 年代)使设置自定义手表表达式变得轻而易举。使用 GUI 调试一堆嵌套循环要简单得多。
啊,是的,模板的问题。最常见的(对我和我的同事来说)问题是错误的上下文:要么你没有变量,要么你的变量没有某些属性。如果您使用debug toolbar,只需检查“模板”部分的上下文,或者,如果这还不够,请在填充完上下文后在视图代码中设置一个中断。
原来如此。
【讨论】:
只使用import pudb;pu.db
少输入【参考方案13】:
在Python代码对应行添加import pdb; pdb.set_trace()
或breakpoint()
(form python3.7)并执行。执行将在交互式 shell 中停止。在 shell 中,您可以执行 Python 代码(即打印变量)或使用以下命令:
c
继续执行
n
在同一函数中跳到下一行
s
跳到该函数或被调用函数的下一行
q
退出调试器/执行
另见:https://poweruser.blog/setting-a-breakpoint-in-python-438e23fe6b28
【讨论】:
【参考方案14】:我强烈推荐 epdb(扩展 Python 调试器)。
https://bitbucket.org/dugan/epdb
我喜欢 epdb 用于调试 Django 或其他 Python 网络服务器的一件事是 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'。我把它扔在这里是为了演示如何使用它来调试本地实例以外的东西,比如本地 LAN 上的开发服务器。显然,如果您这样做,请小心设置跟踪永远不会进入您的生产服务器!
作为一个简短的说明,您仍然可以使用 epdb (import epdb; epdb.set_trace()
) 执行与已接受答案相同的操作,但我想强调服务功能,因为我发现它非常有用。
【讨论】:
epdb 自 2011 年以来未更新。在较新版本的 Django 和/或 Python 上使用它时是否遇到过问题? 我从来没有遇到过针对 Python 2(特别是 2.4-2.7)使用它的问题。事实上,我几天前才使用它。我从未尝试过使用 Python 3。 我在 python 2.7 上运行 django 1.8,我无法让 epdb.connect 与 epdb.serve 对话。我只是得到一个超时。【参考方案15】:我刚刚找到 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 或作为模块导入。
【讨论】:
我认为 PyCharm 只是使用 PyDev,而不是它自己的。【参考方案16】:调试 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()
根据作者的说法,与pdb
的主要区别是:
对于不了解该项目的人来说,wdb 是一个类似于 pdb 的 python 调试器,但有一个流畅的 Web 前端和许多附加功能,例如:
源语法高亮 可视断点 使用绝地的交互式代码完成 持久断点 使用鼠标多线程/多处理支持进行深度对象检查 远程调试 观察表达式 在调试器代码版中 流行的 Web 服务器集成在错误时中断 在与 werkzeug 调试器相反的情况下,在跟踪期间(不是事后分析)异常中断 通过代码注入闯入当前正在运行的程序(在支持的系统上)
它有一个很棒的基于浏览器的用户界面。使用愉快! :)
【讨论】:
与pdb有什么区别?【参考方案17】:我使用PyCharm 和不同的调试工具。还有一篇关于为新手轻松设置这些东西的好文章。 You may start here. 它讲述了 Django 项目的一般 PDB 和 GUI 调试。希望有人能从中受益。
【讨论】:
【参考方案18】:如果使用 Aptana 进行 django 开发,请观看:http://www.youtube.com/watch?v=qQh-UQFltJQ
如果没有,请考虑使用它。
【讨论】:
【参考方案19】:已经提到了大多数选项。 为了打印模板上下文,我为此创建了一个简单的库。 见https://github.com/edoburu/django-debugtools
您可以使用它来打印模板上下文而无需任何% load %
构造:
% print var % prints variable
% print % prints all
它使用自定义的 pprint 格式在 <pre>
标记中显示变量。
【讨论】:
【参考方案20】:我发现 Visual Studio Code 非常适合调试 Django 应用程序。标准的 python launch.json 参数运行 python manage.py
并附带调试器,因此您可以设置断点并根据需要逐步执行代码。
【讨论】:
【参考方案21】:对于那些可能不小心将 pdb 添加到实时提交中的人,我可以建议 #Koobz 答案的扩展:
@register.filter
def pdb(element):
from django.conf import settings
if settings.DEBUG:
import pdb
pdb.set_trace()
return element
【讨论】:
【参考方案22】:根据我自己的经验,有两种方法:
使用ipdb,这是一个类似于pdb的增强调试器。
import ipdb;ipdb.set_trace()
或breakpoint()
(来自python3.7)
使用 django shell,只需使用下面的命令。这在您开发新视图时非常有用。
python manage.py shell
【讨论】:
【参考方案23】:我强烈建议使用 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
【讨论】:
【参考方案24】:正如其他帖子中提到的 - 在代码中设置断点并遍历代码以查看其行为是否符合您的预期,这是学习 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 项目时非常方便。
【讨论】:
【参考方案25】:使用pdb
或ipdb
。这两者的区别在于ipdb支持自动补全。
对于pdb
import pdb
pdb.set_trace()
用于 ipdb
import ipdb
ipdb.set_trace()
对于执行新行点击n
键,继续点击c
键。
使用help(pdb)
查看更多选项
【讨论】:
【参考方案26】:另外的建议。
您可以同时利用 nosetests 和 pdb,而不是手动在您的视图中注入 pdb.set_trace()
。优点是您可以在第一次启动时观察错误情况,可能在第 3 方代码中。
今天我遇到了一个错误。
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 来查看清晰的表单在抱怨什么,在模板中?
是的,我可以。在鼻子测试上使用 --pdb 选项:
tests$ nosetests test_urls_catalog.py --pdb
只要我遇到任何异常(包括正常处理的异常),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)
现在,很明显,我对 Krispy 字段构造函数的选择参数是列表中的列表,而不是元组的列表/元组。
'choices': [[('_', 'any type'), (7, (7, 'type 7', 'RECTYPE_TABLE'))]]
巧妙的是,这个 pdb 是在 Krispy 的代码中发生的,而不是我的,我不需要手动插入它。
【讨论】:
【参考方案27】:在开发过程中,快速添加一个
assert False, value
可以帮助诊断视图或其他任何地方的问题,而无需使用调试器。
【讨论】:
以上是关于如何在Django中调试,好方法? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
在 Python Django 中启用调试时,如何仅关闭 SqlAlchemy 数据库池的日志记录?