如果我开发一个Django应用程序并使用附带的测试服务器,我可以在代码中的任何地方添加import pdb; pdb.set_trace()
,并有一个突破点,将我引入交互式调试器。为了清楚起见,我不打算使用任何IDE,只需简单地设置ssh到VM或远程开发服务器。
如何为WSGI Django应用程序获得类似的行为? (同样,假设设置是我与服务器的ssh会话 - VM或远程)
答案 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
等)WSGIDaemonProcess
,WSGIProcessGroup
等。WSGIPythonHome
,WSGIPythonPath
等来替换守护程序属性。同样,对于gunicorn,您需要设置debug=True
和daemon=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)