2011-09-19 100 views
0

我被困住,絕望。在多個域上運行的多個python web應用程序(虛擬主機)?

是否有可能在cherrypy上使用虛擬主機在多個不同的域上提供多個python web應用程序?等等......我會回答自己:是的,這是可能的。有了虛擬主機調度程序,有可能,直到我需要這個:

我需要使用更多的同一應用程序的實例,但在不同的版本。這意味着我需要以某種方式拆分這些應用程序的python import的命名空間。

例如: 我有應用程序MyApp,它有兩個版本。我有兩個域app1.comapp2.com。 當我訪問app1.com我想獲得1。當我訪問app2.com版本的應用程序MyApp,它應該是MyApp版本2

我現在用的cherrypy 3.2VirtualHostDispatcher,問題是,當我使用從MyApp版本1和MyApp版本2的方法導入,之前已經加載,python將使用已經導入的模塊(由於模塊緩存)。

是..它可以包裝的進口和清潔Python模塊緩存每次(我用這個頂級應用程序對象實例化),但它似乎對我挺不乾淨。我想,這是也效率低下...

那麼,你有什麼建議我? 我正在考慮使用mod_WSGI使用apache2和cherrypy,但似乎這並沒有解決import問題,因爲所有應用程序仍有一個python進程。

也許,我正在考慮完全錯誤的整個問題,我需要重新考慮它。我爲每個想法或小費而開放。唯一的限制是我想使用Python 3.還有其他的東西仍然是開放的討論:-)

謝謝你的每一個迴應!

回答

1

阿帕奇/ mod_wsgi的能做的,就是需要什麼。 mod_wsgi下的每個掛載的web應用程序都將在同一個進程中運行在不同的子解釋器中,因此可以使用不同的代碼庫。更好的是,您使用mod_wsgi的守護進程模式並將每個Web應用程序委派給不同的進程,以避免它們相互干擾。

+0

謝謝。我還在想那個WSGI ......但從未給過機會。皮蒂,因爲這正是我需要的!我只會閱讀一些手冊:-)謝謝! – JoshuaBoshi

0

有關創建myapp_selector模塊,它就像水木清華什麼:

def application(env, start_response): 
    import myapp1 
    import myapp2 
    if env['SERVER_NAME'] == 'myapp1.com': 
     myapp = myapp1 
    elif env['SERVER_NAME'] == 'myapp2.com': 
     myapp = myapp2 
    # ... 
    return myapp.process_request() 
+0

也可以修改sys.path: import sys sys.path.insert(0,'/ path-to-myapp1 /') – rslnx

+0

您錯過了我的問題。使用包含版本號的標識符維護應用程序源代碼是不可能的。如果沒有數字'myapp1','myapp2',您的示例將不起作用。但謝謝,格雷厄姆杜姆普頓先生已經回答:-) – JoshuaBoshi

相關問題