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有一些更有用的扩展
Seafangs建议在Django中使用Python调试器.
Ben*_*end 225
我非常喜欢Werkzeug的交互式调试器.它与Django的调试页面类似,只是在每个级别的回溯上都有一个交互式shell.如果您使用django-extensions,您将获得一个runserver_plus管理命令,该命令启动开发服务器并为您提供Werkzeug的异常调试器.
当然,您应该只在本地运行它,因为它为任何拥有浏览器的人提供了在服务器上下文中执行任意python代码的权限.
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的内存跟踪答案中也有其他好的建议).
Tom*_*ski 43
到目前为止几乎所有内容都已被提及,所以我只会添加,而不是pdb.set_trace()一个可以使用ipdb.set_trace()使用iPython,因此更强大(自动完成和其他好东西).这需要ipdb包,所以你只需要pip install ipdb
Tom*_*tie 33
我已经推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)
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上主持,当然欢迎贡献.
小智 21
调试python的最简单方法 - 特别是对于习惯于Visual Studio的程序员 - 使用的是PTVS(Visual Studio的Python工具).步骤很简单:
如果要使用PTVS调试Django,则需要执行以下操作:
小智 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,它可以从您调用它的位置访问本地变量.
从我的角度来看,我们可以将常见的代码调试任务分解为三种不同的使用模式:
assert False要停止的位置即可.import pudb; pudb.set_trace(). 与[i] pdb相比的主要优点是PuDB(看起来像80年代一样)使得设置自定义手表表达变得轻而易举.使用GUI,调试一堆嵌套循环要简单得多.啊,是的,模板的困境.最常见的(对我和我的同事)问题是错误的上下文:要么您没有变量,要么您的变量没有某些属性.如果您正在使用调试工具栏,只需检查"模板"部分的上下文,或者,如果还不够,请在填写上下文后立即在视图代码中设置中断.
就这样吧.
在 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
我强烈推荐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())接受的答案做同样的事情,但我想强调服务功能,因为我发现它非常有用.
我刚刚找到了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或作为模块导入.
调试 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 调试器相反的跟踪期间(不是事后分析)中的异常中断
- 通过代码注入(在支持的系统上)中断当前正在运行的程序
它有一个很棒的基于浏览器的用户界面。使用愉快!:)
| 归档时间: |
|
| 查看次数: |
223724 次 |
| 最近记录: |