2009-07-03 58 views
6

我創建了一個web.py應用程序,現在它已準備好部署,我想運行在不在web.py的內置web服務器上。我希望能夠在不同的webservers,Apache或IIS上運行它,而不必更改我的應用程序代碼。如果我理解正確,這就是WSGI應該進入的地方。
但是,我不明白爲了讓我的應用程序可以在WSGI服務器上部署,我必須做些什麼?大多數例子假設你使用的是Pylons/Django/other-framework,你只需運行一些魔術命令來修復所有的東西。
從我所瞭解的(非常簡短的)web.py文檔,而不是運行web.application(...).run(),我應該使用web.application(...).wsgifunc()。然後什麼?使用WSGI部署一個Web.py應用程序,幾臺服務器

回答

6

準確地說,您需要做什麼來託管它與特定的WSGI託管機制因服務器而異。

對於Apache/mod_wsgi和Phusion Passenger,您只需提供一個WSGI腳本文件,其中包含一個名爲'application'的對象。對於web.py 0.2,這是使用適當參數調用web.wsgifunc()的結果。對於web.py 0.3,您改爲使用web.application()返回的對象的wsgifunc()成員函數。對於這些細節參見mod_wsgi的文檔:

http://code.google.com/p/modwsgi/wiki/IntegrationWithWebPy

反之,如果你不必使用FASTCGI,SCGI或AJP適配器的服務器,如lighttpd的,Nginx的或切諾基,那麼你需要使用「flup」包在這些語言不可知的接口和WSGI之間提供一個橋樑。這涉及使用相同的WSGI應用程序對象調用flup函數,而不需要使用橋接器,而不需要類似mod_wsgi或Phusion Passenger那樣的東西。對於這個顯示的細節:

http://trac.saddi.com/flup/wiki/FlupServers

重要的是構建Web應用程序,以便它在其自身包含的模塊集。要使用特定的服務器,請根據需要創建單獨的腳本文件,以在該服務器所需的內容和應用程序代碼之間建立橋樑。您的應用程序代碼應始終位於Web服務器文檔目錄之外,並且只有充當橋接的腳本文件纔會在服務器文檔目錄中(如果適用)。

+0

好了,所以有做它沒有一般的方式。可憐。我只需要寫一堆適配器。 無論如何,謝謝! – carlpett 2009-07-06 13:25:52

0

截至2009年7月21日,有在the webpy install site一個更全面的安裝指南中,討論flupFastCGI的阿帕奇多。我還沒有嘗試它,但它似乎更詳細。

0

下面是使用CherryPy的WSGI服務器的兩個託管應用程序的一個例子:

 

#!/usr/bin/python 
from web import wsgiserver 
import web 

# webpy wsgi app 
urls = (
    '/test.*', 'index' 
) 

class index: 
    def GET(self): 
     web.header("content-type", "text/html") 
     return "Hello, world1!" 

application = web.application(urls, globals(), autoreload=False).wsgifunc() 


# generic wsgi app 
def my_blog_app(environ, start_response): 
    status = '200 OK' 
    response_headers = [('Content-type','text/plain')] 
    start_response(status, response_headers) 
    return ['Hello world! - blog\n'] 


""" 
# single hosted app 
server = wsgiserver.CherryPyWSGIServer(
      ('0.0.0.0', 8070), application, 
      server_name='www.cherrypy.example') 

""" 

# multiple hosted apps with WSGIPathInfoDispatcher 
d = wsgiserver.WSGIPathInfoDispatcher({'/test': application, '/blog': my_blog_app}) 
server = wsgiserver.CherryPyWSGIServer(('0.0.0.0', 8070), d)    
server.start() 
相關問題