如果我开发一个 Django 应用程序并使用包含的测试服务器,我可以import pdb; pdb.set_trace()
在代码中的任何位置添加一个,并有一个断点让我进入交互式调试器。为了清楚起见,我并不是说使用任何 IDE,只是简单地设置 ssh-ing 到 VM 或远程开发服务器。
如何为 WSGI Django 应用程序获得类似的行为?(再次,假设的设置是我与服务器的 ssh 会话 - 虚拟机或远程)
如果我开发一个 Django 应用程序并使用包含的测试服务器,我可以import pdb; pdb.set_trace()
在代码中的任何位置添加一个,并有一个断点让我进入交互式调试器。为了清楚起见,我并不是说使用任何 IDE,只是简单地设置 ssh-ing 到 VM 或远程开发服务器。
如何为 WSGI Django 应用程序获得类似的行为?(再次,假设的设置是我与服务器的 ssh 会话 - 虚拟机或远程)
问题是 WSGI 服务器将使用多个进程并分离或重定向标准流 - 输入、输出和动摇它呃。
对于 Apache httpd 和 mod_wsgi:
apachectl -X
以, not apachectl start
(norservice apache2 start
等)开头WSGIDaemonProcess
,WSGIProcessGroup
等。WSGIPythonHome
,WSGIPythonPath
等来替换守护程序属性。同样,对于 gunicorn,您需要设置debug=True
和daemon=False
.
mod_wsgi 指南建议使用类进行包装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)