如何使用远程pdb连接调试在Heroku上运行的Django应用程序?

Gho*_*r21 15 python django debugging heroku pdb

要调试我在Heroku上看到但在本地计算机上没有看到的错误,我正在尝试进行逐步调试.

import pdb; pdb.set_trace()由于您无法访问连接到应用程序的控制台,因此典型方法不适用于Heroku,但显然您可以使用rpdb,即pdb的"远程"版本.

所以我安装了rpdb,import rpdb; rpdb.set_trace()在适当的位置添加.当我发出命中rpdb行的请求时,应用程序按预期挂起,我在heroku日志中看到以下内容:

pdb is running on 3d0c9fdd-c18a-4cc2-8466-da6671a72cbc:4444
Run Code Online (Sandbox Code Playgroud)

好的,那么如何连接到正在运行的pdb?我试图heroku run nc 3d0c9fdd-c18a-4cc2-8466-da6671a72cbc 4444从heroku的系统中尝试连接到命名主机,但只是立即退出状态1并且没有错误消息.

所以我的具体问题是:我现在如何连接到这个远程pdb?

一般相关的问题是:这是否是在Heroku上运行的应用程序的这种交互式调试的正确方法?有没有更好的办法?

注意:重庆CELERY:注意,我现在也尝试过与Celery类似的方法,但无济于事.默认主机celery的rdb(远程pdb包装器)使用的是localhost,当它是Heroku时你无法获得.我已经尝试将CELERY_RDB_HOST环境变量用于Heroku上托管的网站域,但是它提供了"无法分配请求的地址"错误.所以它是相同的基本问题 - 如何连接到在Heroku上运行的远程pdb实例?

hob*_*obs 3

在回答你的第二个问题时,我根据错误类型(浏览器端、后端或视图)采取不同的做法。对于后端和视图测试(单元测试),这样的东西适合您吗?

$ heroku run --app=your-app "python manage.py shell --settings=settings.production"
Run Code Online (Sandbox Code Playgroud)

然后在 ipython 中进行调试:

>>> %run -d script_to_run_unittests.py
Run Code Online (Sandbox Code Playgroud)

即使您没有运行 django 应用程序,您也可以将调试器作为 ipython 的命令行选项运行,这样任何 python 错误都会将您带到调试器:

$ heroku run --app=your-app "ipython --pdb"
Run Code Online (Sandbox Code Playgroud)

前端测试是一个完全不同的领域,您应该研究像 selenium 这样的工具。我认为还有一个“沙拉”测试套件模块,可以使前端测试更容易编写。编写一个中断的测试是调试的第一步(至少有人告诉我;)。

如果错误看起来很简单,您可以随时执行旧的“打印并运行”操作,例如

import logging
logger = logging.getLogger(__file__)
logger.warn('here be bugs')`
Run Code Online (Sandbox Code Playgroud)

并使用 getsentry.com 或等效的监控工具查看您的日志文件,或者只是:

heroku logs --tail
Run Code Online (Sandbox Code Playgroud)