【问题标题】:Which python web framework has hassle-free development and deployment?哪个python web框架可以轻松开发和部署?
【发布时间】:2011-09-23 06:31:36
【问题描述】:

我在 BaseHTTPServer 中编写了一个 Web API。它只能在 localhost 上使用。它在 GET/POST 操作中返回 JSON 对象。

http://localhost:8888/operation?param

代码就像

def do_GET(self):
   if self.path=="operation":
       self.wfile.write("output")

但我担心保持活动机制(阅读:可以重生工作人员的网络服务器)、缺乏多线程和 PITA-ful 维护。


就像我说的,我正在考虑选择这个网络框架的开发部署问题。

发展

网页界面目前有 250 行,功能非常简单。我正在寻找适合清洁维护和部署的东西。我不希望框架的 MVC、ORM、模板和其他功能弄乱我的学习曲线。重定向到适当模块的 UrL 模式很好。

部署

它应该部署在带有 WSGI 模块的成熟服务器上,并且尽量减少麻烦。而且这样的设置具有热部署(为了更好的词),安装新应用程序或更新代码意味着将文件复制到文件系统中的 www-root。


CherryPy 和 Flask 看起来很有趣。 Django 和 Web2Py 似乎太全面了。

【问题讨论】:

标签: python cherrypy flask


【解决方案1】:

部署 wsgi 的推荐方式是作为 长期运行的进程,嵌入或守护进程,而不是作为 cgi 脚本。无论哪种方式,它都会与像在 php 中那样上传文件有点不同,通过触摸配置文件重新启动服务器/进程通常是使用 wsgi 最接近“热部署”的方式。

不用说,如果框架符合 wsgi,则框架本身不会施加任何类型的部署限制。根据您的需要进行选择:apache+modwsgi、gunicorn、cherry.py、paste。它们都没有提供“热部署”(afaik),您仍然需要创建一个 wsgi 脚本并重新加载进程。文件系统布局通常无关紧要,这很好。您通常也不会自动重新加载。我知道 werkzeug 和 cherry.py 可以,而且 werkzeug 也提供了一些非常酷的调试工具。请注意,tornado/werkzeug* 本身提供了一个自动重载选项,但实际上被考虑用于开发而不是部署,not compatible 与 wsgi 模块一起使用。

但是无论部署多么痛苦或轻松,建议使用类似fabric 的东西来自动化您的部署,并且设置一个wsgi web 服务器并不是那么难。

框架本身的选择有点棘手,取决于你想在哪个级别工作。Tornado、werkzeug 是流行的低级框架,(但也包括更高级别的工具,很多是框架+webserver),但是您也可以直接使用webob,只需插入您需要的任何其他内容。

你有像 flask 或 bottle 这样的微框架,然后是 web2.py 这样的轻量级框架,或者可能是金字塔(框架有多重的界限有点​​模糊)。

然后你就有了“全栈”django、grok、turbogears 等...... 然后是zope,它一直在节食,但仍然很重。

请注意,您几乎可以对所有这些组件做任何事情(取决于您想要弯曲它们的程度),并且在许多情况下您可以相当轻松地交换组件。我会开始尝试像 bottleflask 之类的微框架(您不必使用 ORM 或模板,但一旦使用就很容易获得),而且看看 webob

*评论:将 werkzeug 添加到非自动重装阵营中。

【讨论】:

  • Werkzeug 的自动重载和调试工具仅用于开发,不应在生产环境中使用(它们也不能在 WSGI 环境中工作)。
  • "我知道 werkzeug 和cherry.py 可以" 如果它崩溃,这是否会让cherrypy 自动重新加载?热部署呢?
  • "通过触摸配置文件重启服务器/进程"啊,是指触摸命令吧?
  • 没有。检测到源代码更改时自动重新加载。其中包括 touch myfile.wsgi
  • 如果你想通过监控自动重新加载,我推荐类似 supervisord+superlance
【解决方案2】:

对于您所描述的,请使用:Tornado Web Server

这是你好世界:

import tornado.ioloop
import tornado.web

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("Hello, world")

application = tornado.web.Application([
    (r"/", MainHandler),
])

if __name__ == "__main__":
    application.listen(8888)
    tornado.ioloop.IOLoop.instance().start()

它具有高度可扩展性,我认为您可能需要 10 分钟才能使用您的代码进行设置。

【讨论】:

    【解决方案3】:

    我个人一直喜欢并使用 web.py。它非常轻量级、可定制且符合 WSGI。

    http://webpy.org

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-04
      • 2012-03-07
      • 1970-01-01
      • 2014-08-17
      • 1970-01-01
      • 1970-01-01
      • 2013-03-20
      • 1970-01-01
      相关资源
      最近更新 更多