在WSGI中以守护进程模式运行pdb

3

我正在使用Apache 2.2和 mod wsgi 运行Python脚本。

在wsgi的守护进程模式下,是否可以在Python脚本中使用pdb.set_trace()?

编辑 我想使用守护进程模式而不是嵌入式模式的原因是为了具有重新加载代码的功能,而无需每次都重启Apache服务器(这需要嵌入式模式)。我希望能够在不重启Apache的情况下使用代码重新加载,并仍然能够使用pdb...


我建议您使用FCGI或类似的方式进行部署,这样您可以手动控制Python进程并将其作为前台运行,设置pdb,但仍然将其连接到Apache。这是已知可行的方法,与WSGI不同,您无法为该进程附加终端。 - Mikko Ohtamaa
你能否将pdb的内容设为全局,并使用秘密URL /密钥来启用/禁用它?你拥有一种具有反射和随时注入任意代码能力的编程语言。当禁用时应该是零成本的。 - synthesizerpatel
1个回答

1
我有同样的需求,希望能够使用功能强大的来调试Python服务器代码的某些部分,只需在需要调试的地方放置


是的,Apache会在您无法控制的位置生成WSGI应用程序[1]。但我找到了一个很好的折衷方案:
  1. 维护您的Apache WSGIScriptAlias

  2. 同时也给自己提供在终端中启动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服务器代码,我认为上述方法要简单得多。如果实际上有简单的方法,那么我也很愿意学习。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接