如何在Django中进行调试,好方法? [关闭]
我通常只使用Django启用时提供的调试信息。 当事情按预期完成时,我因语法错误而使代码流中断很多,然后查看流中该点的变量以弄清楚代码在其中执行了我想要的操作以外的其他操作。
但这可以改善吗? 是否有一些好的工具或更好的方法来调试Django代码?
#1楼
调试python的最简单方法(尤其是对于使用Visual Studio的程序员而言)是使用PTVS(适用于Visual Studio的Python工具)。 步骤很简单:
- 在“项目设置”的“常规”选项卡中,将“启动文件”设置为“ manage.py”,这是Django程序的入口点。
- 在项目设置-调试选项卡中,将“脚本参数”设置为“ runserver --noreload”。 关键是这里的“ --noreload”。 如果您不设置它,您的断点将不会被击中。
- 好好享受。
#2楼
有很多方法可以做到,但是最直接的方法就是简单地使用Python调试器 。 只需将以下行添加到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代码都使用Python调试器(pdb)。 如果你已经到PDB,你想也想看看IPDB使用IPython中进行调试。
由Seafangs建议在Django中使用Python调试器 。
#3楼
Firebug本身对于调试您开发的任何应用程序的Javascript方面也至关重要。 (假设您当然有一些JS代码)。
我还喜欢使用django-viewtools使用pdb交互式地调试视图,但是我使用的并不多。
还有诸如推土机之类的更有用的工具,用于跟踪内存泄漏(SO的答案中也提供了其他一些很好的建议,用于内存跟踪)。
#4楼
我将pyDev与Eclipse 搭配使用非常好,设置断点,进入代码,查看任何对象和变量的值,然后尝试。
#5楼
当然,您只应在本地运行此命令,因为它使拥有浏览器的任何人都有权在服务器的上下文中执行任意python代码。
#6楼
提到大多数选项。 为了打印模板上下文,我为此创建了一个简单的库。 参见https://github.com/edoburu/django-debugtools
您可以使用它来打印模板上下文,而无需任何{% load %}
构造:
{% print var %} prints variable
{% print %} prints all
#7楼
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) list85 raise some_error.CustomError()86 87 # Example login view88 def login(request, username, password):89 import epdb; epdb.serve()90 -> return my_login_method(username, password)9192 # Example view to show session key93 def get_session_key(request):94 return request.session.session_key95
如果要同时服务或连接到多个epdb实例,则可以指定要监听的端口(默认为8080)。 即
import epdb; epdb.serve(4242)>> import epdb; epdb.connect(host='192.168.3.2', port=4242)
简要说明一下,您仍然可以使用epdb( import epdb; epdb.set_trace()
)做与已接受答案相同的操作,但是由于我发现它非常有用,因此我想强调它的服务功能。
#8楼
我使用PyCharm和其他调试工具。 也有一篇不错的文章集,关于为新手轻松设置这些东西。 您可以从这里开始。 它介绍了有关Django项目的PDB和GUI调试的一般信息。 希望有人能从中受益。
#9楼
也是有关python调试器的非常有用的文章: https : //zapier.com/engineering/debugging-python-boss/
也可以从命令行或作为模块导入来运行pyinstrument。
#10楼
有时候,当我想探索一种特定的方法并且召唤pdb太麻烦时,我会添加:
import IPython; IPython.embed()
IPython.embed()
启动一个IPython shell,该shell可以从调用它的地方访问局部变量。
#11楼
如果您还没有使用它,我建议您试用30天,以了解PyCharm的功能。 我确定还有其他工具,例如Aptana。 但是我想我也喜欢PyCharm的外观。 我在那里调试我的应用程序感到非常舒适。
#12楼
@register.filter
def pdb(element):import pdb; pdb.set_trace()return element
现在,在模板内部,您可以执行{{ template_var|pdb }}
并输入一个pdb会话(假设您正在运行本地devel服务器),您可以在其中检查心脏内容的element
。
#13楼
#14楼
import pdb
pdb.set_trace()
您可以检查所有变量值,进入函数等等。 https://docs.python.org/2/library/pdb.html
#15楼
如此处其他文章所述-在代码中设置断点并遍历代码以查看其行为是否符合您的预期,这是学习Django之类的好方法,直到您对它们的行为方式有了很好的了解-以及代码的含义是在做。
为此,我建议使用WingIde。 就像其他提到的IDE一样,它们易于使用,易于布局,易于设置断点,因此可以评估/修改堆栈等。非常适合可视化代码在逐步执行时的工作。 我是它的忠实粉丝。
我也使用PyCharm-它具有出色的静态代码分析功能,有时可以帮助您在发现问题之前就发现问题。
如前所述,django-debug-toolbar是必不可少的-https: //github.com/django-debug-toolbar/django-debug-toolbar
这将显示您的视图已生成的SQL查询。 这将使您对ORM的工作方式以及查询是否高效还是需要重新编写代码(或添加缓存)有一个很好的了解。
然后,如果发现不良情况(从性能或查询数量的角度来看),我将重新打开SQL语句的完整显示以查看发生了什么。 当您与多个开发人员一起从事大型Django项目时,非常方便。
#16楼
我使用PyCharm (与Eclipse相同的pydev引擎)。 确实可以帮助我直观地逐步查看我的代码并查看正在发生的事情。
#17楼
从我的角度来看,我们可以将常见的代码调试任务分解为三种不同的使用模式:
- 出现了一个异常 : runserver_plus'Werkzeug调试器进行了救援。 在所有跟踪级别上运行自定义代码的能力是一个杀手er。 如果您完全陷入困境,则可以创建一个Gist,只需单击即可共享。
- 页面被渲染,但是结果是错误的 :再次,Werkzeug摇摆不定。 要在代码中创建断点,只需在要停止的位置键入
assert False
。 - 代码工作不正确 ,但快速浏览无济于事。 最有可能是算法问题。 叹。 然后我通常会启动一个控制台调试器PuDB :
import pudb; pudb.set_trace()
import pudb; pudb.set_trace()
。 与[i] pdb相比,主要优点是PuDB(看起来像80年代)使设置自定义监视表达式变得轻而易举。 使用GUI调试一堆嵌套循环要简单得多。
#18楼
您可以利用nosetests和PDB在一起,而注射pdb.set_trace()
手动在你的看法。 这样做的好处是,您可以在首次启动时观察错误情况,可能会使用第三方代码。
TypeError at /db/hcm91dmo/catalog/records/render_option() argument after * must be a sequence, not int....Error during template renderingIn 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来查看模板中抱怨的脆性表单吗?
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_widgetreturn 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 renderoptions = 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_optionsoutput.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)
现在,很明显,我对crispyfield构造函数的选择参数是因为它是列表中的列表,而不是元组的列表/元组。
'choices': [[('_', 'any type'), (7, (7, 'type 7', 'RECTYPE_TABLE'))]]
整洁的是,此pdb发生在crispy的代码中,而不是我的,并且我不需要手动插入它。
#19楼
使用pdb
或ipdb
。 两者之间的区别在于ipdb支持自动完成。
import pdb
pdb.set_trace()
import ipdb
ipdb.set_trace()
要执行换行,请按n
键,然后继续按c
键。 使用help(pdb)
检查更多选项help(pdb)
#20楼
assert False, value
#21楼
#22楼
对于那些可能将pdb意外添加到实时提交中的人,我可以建议#Koobz答案的扩展名:
@register.filter
def pdb(element):from django.conf import settingsif settings.DEBUG: import pdbpdb.set_trace()return element
#23楼
调试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前端和许多其他功能,例如:
- 源语法突出显示
- 视觉断点
- 使用jedi的交互式代码完成
- 持久断点
- 使用鼠标多线程/多处理支持进行深层对象检查
- 远程调试
- 观看表情
- 在调试器代码版本中
- 流行的Web服务器集成可打破错误
- 例如,在跟踪过程中发生异常中断(不是事后检验),与werkzeug调试器相反
- 通过代码注入(在受支持的系统上)破坏当前正在运行的程序
它具有出色的基于浏览器的用户界面。 使用愉快! :)
#24楼
添加import pdb; pdb.set_trace()
在Python代码对应行的import pdb; pdb.set_trace()
或breakpoint()
(来自python3.7)并执行它。 执行将以交互式外壳程序停止。 在外壳程序中,您可以执行Python代码(即打印变量)或使用以下命令:
c
继续执行n
跳至同一函数中的下一行s
转到此函数或被调用函数的下一行q
退出调试器/执行
另请参阅: https : //poweruser.blog/setting-a-breakpoint-in-python-438e23fe6b28
#25楼
根据我自己的经验,有两种方法:
使用ipdb ,它是像pdb一样的增强调试器。
import ipdb;ipdb.set_trace()
或breakpoint()
(来自python3.7)使用django shell,只需使用下面的命令。 在开发新视图时,这非常有帮助。
python manage.py shell
#26楼
我已经将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_errorone_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上 ,当然欢迎您贡献。
#27楼
如果使用Aptana进行Django开发,请观看以下内容: http : //www.youtube.com/watch?v= qQh-UQFltJQ
如果没有,请考虑使用它。
如何在Django中进行调试,好方法? [关闭]相关推荐
- 如何在Django中以GROUP BY查询?
本文翻译自:How to query as GROUP BY in django? I query a model: 我查询一个模型: Members.objects.all() And it ret ...
- django 传递中文_如何在Django中建立消息传递状态
django 传递中文 by Ogundipe Samuel 由Ogundipe Samuel 如何在Django中建立消息传递状态 (How to Build a Message Delivery ...
- Makefile:Makefile中的调试打印方法
Makefile中的调试打印方法 使用info/warning/error增加调试信息 info #info信息,不打印信息所在行号 $(info "here add the debug i ...
- 如何在Django中优雅的使用pyecharts设计可视化BI系统(多图表)
这两天琢磨了一下pyecharts这个库,自己总结了一些内容,具体如下: 大多数人在做用python库做数据分析的时候,都在用jupyter,用这个工具是没有错,而且非常方便就可以即时的显示数据,这个 ...
- 如何在Django中接收JSON格式的数据
Django做了大量工作简化我们的Web开发工作, 这其中当然也包括接收来自客户端的数据这一普遍需求. 大部分时候,从客户端传入的数据主要是FORM的POST数据,和来自URL的GET数据, 在Dja ...
- 如何在PHP中实现链式方法调用
写程序的人都喜欢偷懒,希望少打几行代码,并且让代码看起来很酷. 所以很多人写程序都会选择三元运算取代if..else.... 而用过JS的人应该都见识过js中的链式方法. 如 somevars.fun ...
- django模型查询_如何在Django中编写有效的视图,模型和查询
django模型查询 I like Django. It's a well-considered and intuitive framework with a name I can pronounce ...
- django 静态数据_如何在Django中使用静态数据?
django 静态数据 Static Data means those data items that we cannot want to change, we want to use them as ...
- python列出所有方法_如何在python中列出所有Faker方法
如何以编程方式列出Faker生成器对象中的所有可用方法? Faker文档显示了如何创建faker生成器并生成数据: from faker import Faker fake = Faker() fak ...
最新文章
- 灾难恢复级别_防患于未然:灾难恢复全攻略,助你有效恢复业务数据
- Gephi——使用map of countries和Geo Layout实现包含地理坐标的数据可视化
- tensor flow lstm 图像 一条直线_【开源计划】图像配准中变形操作(Warp)的pytorch实现...
- 猪年看猪,猪男猪女一共十个。
- Collection和Collections区别
- 《ASP.NET Core 微服务实战》-- 读书笔记(第4章)
- test 7 3-22 2021省选模拟赛seven
- fiddler抓包工具-- 本地资源替换线上文件
- 酒精测试仪检定设备设计与验证
- 标准模板库 STL 使用之 —— vector 使用 tricks
- 使用C语言打印出一个菱形
- 一次 注册dll失败 的经历
- 移动硬盘需要格式化才能打开如何解决?
- 维度诅咒_维度的诅咒减去行话的诅咒
- 裸金属服务器能虚拟化吗,裸金属服务器虚拟化概述
- 解决网页打开json文件中文乱码情况
- Deployer-6-部署流-Flow
- 经典算法题:二分查找
- 有哪些好用的设备巡检类的软件?
- 基于Aforge的手势识别之一~~~简单的手写识别