Django - 对运行wsgi的应用程序使用pdb交互式调试

时间:2012-11-01 09:49:02

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

如果我开发一个Django应用程序并使用附带的测试服务器,我可以在代码中的任何地方添加import pdb; pdb.set_trace(),并有一个突破点,将我引入交互式调试器。为了清楚起见,我不打算使用任何IDE,只需简单地设置ssh到VM或远程开发服务器。

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

2 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:0)

问题是WSGI服务器将使用多个进程并分离或重定向标准流 - 进入,退出和动摇所有关于错误。

对于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)