我正在使用Apache 2.2和 mod wsgi 运行Python脚本。
在wsgi的守护进程模式下,是否可以在Python脚本中使用pdb.set_trace()?
编辑 我想使用守护进程模式而不是嵌入式模式的原因是为了具有重新加载代码的功能,而无需每次都重启Apache服务器(这需要嵌入式模式)。我希望能够在不重启Apache的情况下使用代码重新加载,并仍然能够使用pdb...
我正在使用Apache 2.2和 mod wsgi 运行Python脚本。
在wsgi的守护进程模式下,是否可以在Python脚本中使用pdb.set_trace()?
编辑 我想使用守护进程模式而不是嵌入式模式的原因是为了具有重新加载代码的功能,而无需每次都重启Apache服务器(这需要嵌入式模式)。我希望能够在不重启Apache的情况下使用代码重新加载,并仍然能够使用pdb...
维护您的Apache WSGIScriptAlias
同时也给自己提供在终端中启动Python服务器的选项(在这种情况下,本地测试而不是通过Apache)
WSGIScriptAlias
...指向名为webserver.py
的Python WSGI脚本。<VirtualHost *:443>
ServerName myawesomeserver
DocumentRoot /opt/local/apache2/htdocs
<Directory /opt/local/apache2/htdocs>
[...]
</Directory>
WSGIScriptAlias /myapp /opt/local/apache2/my_wsgi_scripts/webserver.py/
<Directory /opt/local/apache2/my_wsgi_scripts/>
[...]
</Directory>
[...]
SSLEngine on
[...]
</VirtualHost>
因此,您的webserver.py
可以有一个简单的开关,用于在Apache使用时切换并手动启动调试。
在您的配置文件中保留一个标志,例如,在某些settings.py
中:
WEBPY_WSGI_IS_ON = True
而且 webserver.py
:
import web
import settings
urls = (
'/', 'excellentWebClass',
'/store', 'evenClassier',)
if settings.WEBPY_WSGI_IS_ON is True:
# MODE #1: Non-interactive web.py ; using WSGI
# So whenever true, the Web.py application here will talk wsgi.
application = web.application(urls, globals()).wsgifunc()
class excellentWebClass:
def GET(self, name):
# Drop a pdb wherever you want only if running manually from terminal.
pdb.set_trace()
try:
f = open (name)
return f.read()
except IOError:
print 'Error: No such file %s' % name
if __name__ == "__main__":
# MODE #2: Interactive web.py , for debugging.
# Here you call it directly.
app = web.application(urls, globals())
app.run()
当您想要交互式测试您的Web服务器时,只需从终端运行它即可。
$ python webserver.py 8080
starting web...
http://0.0.0.0:8080/
[1] 注:有一些非常复杂的方法可以控制Apache子进程,但如果您只想调试Python服务器代码,我认为上述方法要简单得多。如果实际上有简单的方法,那么我也很愿意学习。