Django Gunicorn Debug

11
起初,我有一个带有测试服务器的Django应用程序。为了调试这个设置,我可以在代码的任何地方添加import pdb; pdb.set_trace(),从而在终端(命令行)中进入交互式调试器。

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

是否有人有解决方法呢?


你找到了如何使它工作的方法吗? - duduklein
是的,请阅读我的回答。这是我现在所做的... - Srikar Appalaraju
我成功地将gunicorn和ipdb一起使用。请参见我的答案。我建议将超时时间设置为更大的值,这样您就有时间进行调试。 - duduklein
5个回答

5
在调试器/调试模式下,在Nginx的反向代理配置中运行Green Unicorn,输入以下设置到PyCharm的Run/Django/Edit configurations中:
当然,使用你已经配置好的Nginx代理的任何端口(而不是7777)。

Screenshot


1
Python中使用GUI是什么意思? :D - holms
这并没有真正帮助。op想要使用pdb,而不是PyCharm的GUI来进行调试。 - WhyNotHugo

4

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

我使用了远程Python调试器 - winpdb和它的嵌入式调试

  1. install winpdb in Your virtualenv

    pip install winpdb
    
  2. import and run embedded debugger in Your code:

    import rpdb2
    rpdb2.start_embedded_debugger('pass')
    
  3. run gunicorn with --timeout argument

    gunicorn -t 3600 env:application
    
  4. run proper view using browser eg. http://127.0.0.1:8000/your-view/

  5. connect to embedded debugger using winpdb:

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

    It will prompt You for a password (use one You set in Your code, in my example it is 'pass') and run nice GUI with debugger.

  6. if You need tutorial for winpdb - here You are.

enter image description here


2

如果您能够启动gunicorn并指向一个application实例,该实例是werkzeug库中的DebuggedApplication类的实例,那么您就可以在浏览器中使用werkzeug调试器设置断点,只需使用import ipdb; ipdb.set_trace()即可。

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 traceback调试器就会在UI(即Web浏览器)中可见。这个可以实现。然后我从UI的命令行中调用import ipdb; ipdb.set_trace()。这会导致一个异常,看起来ipdb不喜欢它的控制台(它似乎是一些HTML*类,当它应该在浏览器中工作时,这听起来并不完全正确)。 - Uwe Geuder

2

我现在成功地使用gunicorn和ipdb来运行Django。

运行命令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:在Django中使用Python调试器建议始终运行python -m pdb manage.py runserver。虽然这在django的开发服务器上不是必要的,但我决定尝试一下gunicorn和ipdb,结果成功了。


0
我最后做的是在需要使用pdb时运行python manage.py runserver <your_external_IP>:8000
因此,您需要在同一台机器上拥有2个不同的代码库,一个是LIVE生产版本(运行gunicorn的版本),另一个是TEST版本,我需要在其中调试并使用pdb的版本。当TEST版本稳定后,我将TEST分支LIVE分支合并。没有在LIVE分支上进行开发或更改,这样可以避免合并冲突。
希望这可以帮助那些沉迷于pdb的人;)

2
如果你使用https反向代理(例如nginx),这实际上是不起作用的。 - Kimvais
@Kimvais,是的,你说得对。如果您知道如何在反向HTTP代理的情况下执行此操作,我很想了解设置... - Srikar Appalaraju
1
我只知道如何在PyCharm中完成这个操作,但我会将其发布为答案。 - Kimvais

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接