在dotcloud上使用wsgi的Web.py

8 投票
1 回答
2052 浏览
提问于 2025-04-16 13:18

我正在尝试把我的 web.py 应用部署到 dotcloud 上,但不知道该怎么做。

我看过这个教程,感觉还不错: http://docs.dotcloud.com/static/tutorials/firststeps/

然后我又查看了 http://docs.dotcloud.com/static/components/python/ ...

Python 服务可以托管任何符合 WSGI 标准的 Python 网络应用。

这包括所有现代的 Python 网络框架:Django、Pylons、web.py、web2py 等等。

...

Python 是通过 Nginx + uWSGI 运行的,由 supervisord 管理。静态资源直接由 Nginx 提供,这样性能更好。

...

DotCloud 依赖一些成熟的工具和约定来构建你的应用。把任何应用适配到 DotCloud 上应该是很简单的。

...

在部署你的应用时,DotCloud 会寻找一个叫做 wsgi.py 的文件。确保在你的应用目录的根目录下创建这个文件。


在网上搜索 "web.py wsgi" 会找到 http://webpy.org/install,上面有一堆让人困惑的说明。我尝试了页面上的几个建议,但都没能成功。

看起来最有希望的办法是创建一个叫 wsgi.py 的文件,内容如下:

import web

urls = (
  '/(.*)', 'hello'
)

class hello:    
  def GET(self, name):
    if not name: 
      name = 'World'
    return 'Hello, ' + name + '!'

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

我还在旁边创建了一个空的 __init__.py 文件。

然后我做了:

dotcloud create jca_hello.py
dotcloud deploy -t python jca_hello.www
dotcloud push jca_hello.www .

但是现在当我访问 http://www.jca_hello.dotcloud.com/ 时,我看到的只是:

uWSGI 错误

wsgi 应用未找到

有什么想法吗?

1 个回答

12

我也是web.py的用户,顺便说一下,我在DotCloud工作:-)

我们使用uWSGI来运行你的WSGI应用。关键是uWSGI在寻找一个叫“application”的变量。

以下是我通常的做法:

app = web.application(urls, globals())

if __name__ == '__main__':
    app.run()
else:
    web.config.debug = False
    application = app.wsgifunc()

这样你就可以在本地机器上继续使用你的应用:

$ python ./wsgi.py

同时也可以把它推送到生产环境(当然是在DotCloud上;)并且关闭调试模式。

这是你修正后的wsgi.py文件:

import web

urls = (
  '/(.*)', 'Hello'
)

class Hello(object):

    def GET(self, name):
        if not name:
            name = 'World'
        return 'Hello, ' + name + '!'

app = web.application(urls, globals())

if __name__ == '__main__':
    app.run()
else:
    web.config.debug = False
    application = app.wsgifunc()

要确保你的wsgi.py文件放在你的应用根目录下。

另外,确保你的应用根目录里有一个名为“requirements.txt”的文件,里面包含:

web.py

如果在部署过程中遇到任何问题,随时可以联系DotCloud的支持团队。

撰写回答