使用WSGI部署Web.py应用程序,多个服务器

时间:2009-07-03 09:35:36

标签: python wsgi web.py

我已经创建了一个web.py应用程序,现在已经可以部署了,我希望不在web.py的内置Web服务器上运行。我希望能够在不同的Web服务器,Apache或IIS上运行它,而无需更改我的应用程序代码。如果我理解正确的话,这就是WSGI应该进入的地方 但是,我不明白为了使我的应用程序可以在WSGI服务器上部署,我必须做些什么呢?大多数示例假设您正在使用Pylons / Django / other-framework,您只需运行一些魔法命令即可为您修复所有内容。
根据我对(非常简短的)web.py文档的理解,我应该使用web.application(...).run()而不是运行web.application(...).wsgifunc()。然后什么?

3 个答案:

答案 0 :(得分: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

如果您不得不为Lighttpd,nginx或Cherokee等服务器使用FASTCGI,SCGI或AJP适配器,那么您需要使用'flup'包来提供这些语言无关接口和WSGI之间的桥梁。这涉及使用上面相同的WSGI应用程序对象调用flup函数,类似mod_wsgi或Phusion Passenger这样的东西将直接使用而无需桥接。有关详细信息,请参阅:

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

重要的是构建您的Web应用程序,使其位于自己的自包含模块集中。要使用特定服务器,请根据需要创建单独的脚本文件,以便在服务器要求和应用程序代码之间建立桥接。您的应用程序代码应始终位于Web服务器文档目录之外,并且只有作为网桥的脚本文件才会在服务器文档目录中(如果适用)。

答案 1 :(得分:0)

截至2009年7月21日,the webpy install site有一个更全面的安装指南,讨论 flup fastcgi apache 等等。我还没有尝试它,但它似乎更详细。

答案 2 :(得分: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()