【问题标题】:Django Gunicorn DebugDjango Gunicorn 调试
【发布时间】:2012-10-24 00:37:34
【问题描述】:

最初我有一个包含测试服务器的 Django 应用程序。要调试此设置,我可以在代码中的任何位置添加import pdb; pdb.set_trace(),并设置一个断点,让我进入终端中的交互式调试器(在命令行上)。

最近我转向 gunicorn 以获得一些性能优势。使用此 Gunicorn 设置时如何获得类似的行为。我尝试使用 debug=Truedaemon=False 设置 gunicorn 设置,但它不起作用。

谁有办法解决这个问题?

【问题讨论】:

  • 你知道如何让它工作吗?
  • 是的,请阅读我的回答。这就是我现在所做的......
  • 我设法将 gunicorn 和 ipdb 一起使用。请参阅下面的答案。我还建议将超时设置为更大的值,以便您有时间进行调试。
  • 你为什么不接受你自己的答案?

标签: django debugging wsgi gunicorn pdb


【解决方案1】:

如果您能够启动指向 application 实例的 gunicorn,该实例是来自 werkzeug 库的 DebuggedApplication 类的实例,您将能够使用带有 import ipdb; ipdb.set_trace() 的 werkzeug 调试器设置断点就在您的浏览器中。

import django.core.handlers.wsgi
from werkzeug.debug import DebuggedApplication

application = django.core.handlers.wsgi.WSGIHandler()
application = DebuggedApplication(application, evalex=True)

当然,确保安装 werkzeug 库和 ipdb。 (pip install werkzeugpip install ipdb

【讨论】:

  • @calvin-cheng:不确定这应该如何工作。首先,我应该得到一个未处理的异常,以便 Werzeug 回溯调试器在 UI(即 Web 浏览器)中变得可见。这样可行。在 UI 中的命令行中,我调用了 import ipdb; ipdb.set_trace()。这会导致异常,在我看来 ipdb 不喜欢它的控制台(它似乎是一些 HTML* 类,当它应该在浏览器中工作时听起来并不完全错误。)
【解决方案2】:

当我想使用pdb 时,我最终做的是运行python manage.py runserver <your_external_IP>:8000

因此,您需要在同一台机器上拥有 2 个不同的存储库,一个是 LIVE 生产版本(一个正在运行 gunicorn),另一个是 TEST 版本,我需要在我使用 pdb 的位置进行调试.当 TEST 版本看起来稳定时,我将 TEST branchLIVE branch 合并。 LIVE branch 不会发生任何开发或更改,这样我就可以避免合并冲突。

希望这对沉迷于pdb 的其他人有所帮助;)

【讨论】:

  • 如果你有 https 反向代理(例如 nginx),这实际上 NOT 工作
  • @Kimvais 是的,你是对的。如果您知道如何在存在反向 HTTP 代理的情况下执行此操作,我很想知道设置...
  • 我只知道如何在 PyCharm 中做到这一点,put 将作为答案发布
【解决方案3】:

我现在设法将 gunicron 与 djnago 和 ipdb 一起使用。

运行python -m ipdb manage.py run_gunicorn --debug -t 3600

我正在使用 Django 1.4 和 gunicorn 0.16.1。那么您通常可以在代码中使用import ipdb; ipdb.set_trace()。不需要werkzeug 库。

我正在尝试调试 facebook 应用程序,因此我无法使用内置开发服务器,因为 facebook 尝试使用 SSL,而开发服务器无法正确响应

在寻找解决方案时,我发现了一个帖子pdb: Using the Python debugger in Django,它建议一直运行python -m pdb manage.py runserver。虽然这对于 django 的开发服务器来说不是必需的,但我决定用 gunicordn 和 ipdb 试一试,它成功了。

【讨论】:

    【解决方案4】:

    要在调试器/调试模式下以反向代理配置(nginx下)运行绿色独角兽,在PyCharm的运行/Django/编辑配置中输入以下设置:

    当然,使用您已将 nginx 配置为代理的任何端口(而不是 7777)。

    【讨论】:

    • python 使用 GUI 做什么:D?
    • 这并没有真正的帮助。 op 想使用pdb,而不是 PyCharm 的 GUI 来调试。
    【解决方案5】:

    好的,我最近偶然发现了类似的问题。我无法应用@dudklein 解决方案(调试器尝试获取输入时出现 I/O 错误 - ipdb、pdb 等)

    我使用了远程 python 调试器 - winpdb,它是 embedded debugging

    1. 在你的 virtualenv 中安装 winpdb

      pip install winpdb
      
    2. 在您的代码中导入并运行嵌入式调试器:

      import rpdb2
      rpdb2.start_embedded_debugger('pass')
      
    3. 使用 --timeout 参数运行 gunicorn

      gunicorn -t 3600 env:application
      
    4. 使用浏览器运行正确的视图,例如。 http://127.0.0.1:8000/your-view/

    5. 使用 winpdb 连接到嵌入式调试器:

      winpdb -a /path/to/django/app/views.py
      

      它会提示您输入密码(使用您在代码中设置的密码,在我的示例中为“pass”)并使用调试器运行漂亮的 GUI。

    6. 如果您需要 winpdb - here You are 的教程。

    【讨论】:

      猜你喜欢
      • 2012-08-30
      • 1970-01-01
      • 1970-01-01
      • 2013-03-25
      • 2013-03-01
      • 2012-09-09
      • 1970-01-01
      • 2016-01-04
      • 2011-09-18
      相关资源
      最近更新 更多