2011-08-28 81 views
3

我正在使用mod wsgi在Apache 2.2上運行Python腳本。使用WSGI在守護進程模式下運行pdb

是否可以在wsgi中使用守護進程模式在python腳本中運行pdb.set_trace()?

編輯 我想用守護進程模式而不是嵌入模式的原因是爲了重新加載代碼,而無需每次(其中嵌入模式需要)重新啓動Apache服務器的能力。我希望能夠使用代碼重新加載而無需每次重新啓動Apache並仍然能夠使用pdb ...

+0

我建議你部署使用FCGI或類似的地方,你可以手動控制Python進程並運行它作爲前臺,設置PDB,但仍然有它連接到Apache。它已知可以工作,與WSGI不同,您無法在該過程中附加終端。 –

+0

難道你不能讓pdb的東西全球化,並使用一個祕密的URL /密鑰來啓用/禁用它?你有一種編程語言,具有反射功能,並且可以隨時隨地注入任意代碼。禁用時應爲零成本。 – synthesizerpatel

回答

1

我有同樣的需要能夠使用強大的pdb,將pdb.set_trace()放在任何我想要的地方調試一部分Python服務器代碼。

是,阿帕奇將在一個地方WSGI應用的地方是在你的控制[1]的。但是,我發現了一個很好的折衷辦法是

  1. 保持你的Apache WSGIScriptAlias

  2. ,也給自己開始在終端你的Python服務器以及(通過在本地,而不是測試Apache了的選項在這種情況下)

所以,如果一個使用WSGIScriptAlias有點像這樣... 指向您的Python WSGI腳本調用webserver.py

<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] Foo注意:有一些非常複雜的方法可以讓Apache子進程處於你的控制之下,但是我認爲如果你只是想調試你的Python服務器代碼,上面的代碼就簡單多了。如果真的有簡單的方法,那麼我也很想了解這些。