使用WSGI以守护进程模式运行pdb

时间:2011-08-28 17:53:52

标签: python apache wsgi

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

是否可以在wsgi中使用守护进程模式在python脚本中运行pdb.set_trace()?

修改 我想使用守护进程模式而不是嵌入模式的原因是能够重新加载代码而无需每次都重新启动Apache服务器(嵌入模式需要)。我希望能够在不重新启动Apache的情况下使用代码重新加载,并且仍然可以使用pdb ......

1 个答案:

答案 0 :(得分:1)

我有同样的需求,能够使用功能强大的pdb,在我想调试Python服务器代码的某些部分的任何地方删除pdb.set_trace()

是的, Apache 会在无法控制的地方生成 WSGI 应用程序[1]。但我发现一个很好的妥协是

  1. 维护您的Apache WSGIScriptAlias

  2. 并且还可以选择在终端中启动Python服务器(在本地测试,而不是通过 Apache 进行测试)

  3. 所以如果使用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()
    

    因此,当您想要以交互方式测试您的网络服务器时,您只需从终端

    运行它
    $ python webserver.py 8080
    starting web...
    http://0.0.0.0:8080/
    

    [1]脚注:有一些非常复杂的方法可以让你控制Apache子进程,但是如果你只是想调试你的Python服务器代码,我认为上面的内容要简单得多。如果实际上有简单的方法,那么我也希望了解这些方法。