【问题标题】:Django - use pdb interactive debug for wsgi running appDjango - 对运行 wsgi 的应用程序使用 pdb 交互式调试
【发布时间】:2012-10-21 21:17:31
【问题描述】:

如果我开发一个 Django 应用程序并使用包含的测试服务器,我可以在代码中的任何位置添加一个import pdb; pdb.set_trace(),并设置一个断点,让我进入交互式调试器。为了清楚起见,我并不是说使用任何 IDE,只是简单地设置 ssh-ing 到 VM 或远程开发服务器。

如何为 WSGI Django 应用程序获得类似的行为? (再次,假设的设置是我与服务器的 ssh 会话 - 虚拟机或远程)

【问题讨论】:

    标签: django debugging remote-debugging pdb django-dev-server


    【解决方案1】:

    据我所知,如果您想将 pdb 与任意 wsgi 应用程序一起使用,最好的办法是使用rpdb2

    (对于 mod_wsgi 上的 Django 和 apache,您可以参考本指南:http://code.google.com/p/modwsgi/wiki/DebuggingTechniques

    【讨论】:

    【解决方案2】:

    问题在于 WSGI 服务器将使用多个进程并分离或重定向标准流 - 输入、输出和 shake it all about 错误。

    对于 Apache httpd 和 mod_wsgi:

    • apachectl -X 开头,而不是apachectl start(也不是service apache2 start 等)
    • 请勿使用WSGIDaemonProcessWSGIProcessGroup
      您可能需要添加WSGIPythonHomeWSGIPythonPath 等来替换守护进程属性。

    同样,对于 gunicorn,您需要设置 debug=Truedaemon=False


    mod_wsgi guide 建议使用类包装 wsgi.application,在每个请求开始时调用 pdb,但任何其他陷阱都应该有效。

    class Debugger:
        def __init__(self, object):
            self.__object = object
    
        def __call__(self, *args, **kwargs):
            import pdb, sys
            debugger = pdb.Pdb()
            debugger.use_rawinput = 0
            debugger.reset()
            sys.settrace(debugger.trace_dispatch)
            try:
                return self.__object(*args, **kwargs)
            finally:
                debugger.quitting = 1
               sys.settrace(None)
    
    application = Debugger(application)
    

    【讨论】:

    • 对于 mod_wsgi,最好使用mod_wsgi-express,然后使用--enable-debuggerstart-server。它尽一切努力让您使用调试器。
    猜你喜欢
    • 2013-03-25
    • 1970-01-01
    • 2014-10-19
    • 1970-01-01
    • 2011-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-08
    相关资源
    最近更新 更多