11

我正在开发一个基于 Python 的应用程序(HTTP -- REST 或 jsonrpc 接口),它将在生产自动化测试环境中使用。这将连接到运行所有测试脚本的 Java 客户端。即,不需要人工访问(除了测试应用程序本身)。

我们希望将其部署在 Raspberry Pi 上,因此我希望它相对较快且占用空间小。它可能不会收到大量请求(在最大负载下,可能每秒几个),但它应该能够运行并在很长一段时间内保持稳定。

由于它的简单性(一个文件),我选择了 Bottle 作为框架。这是对 Flask 的一次折腾。任何认为 Flask 可能更好的人,请告诉我原因。

我一直对 Bottle 内置 HTTP 服务器的稳定性有点不确定,所以我正在评估这三个选项:

  1. 仅使用 Bottle -- 作为 http 服务器 + 应用程序
  2. 在 uwsgi 之上使用 Bottle -- 使用 uwsgi 作为 HTTP 服务器
  3. 在 nginx/uwsgi 中使用 Bottle

问题:

  • 如果我除了 Python/uwsgi 什么都不做,有什么理由将 nginx 添加到组合中吗?
  • uwsgi/bottle(或 Flask)组合会被视为生产就绪吗?
  • 通过使用与 Bottle 内置服务器不同的 HTTP 服务器,我是否可能会有所收获?
4

3 回答 3

15

Flask vs Bottle 对我来说归结为几件事。

  1. 应用程序多么简单。如果它简单,那么瓶子是我的选择。如果没有,那么我就选择了 Flask。瓶子是单个文件的事实使部署变得非常简单,只需将文件包含在我们的源代码中即可。但是瓶子是单个文件的事实应该很好地表明它没有实现完整的 wsgi 规范及其所有边缘情况。
  2. 应用程序做什么。如果它必须渲染除 Python->JSON 之外的任何东西,那么我会使用 Flask,因为它内置了对 Jinja2 的支持。如果我需要进行身份验证和/或授权,那么 Flask 已经有一些非常好的扩展来处理这些要求。如果我需要做缓存,Flask-Cache 存在并且用最少的设置做得很好。我不完全确定有什么可用于瓶子扩展,所以这可能仍然值得一看。

使用瓶子内置服务器的问题在于它将是单进程/单线程,这意味着您一次只能处理一个请求。

要解决该限制,您可以不按特定顺序执行以下任何操作。

  1. Eventlet的wsgi包装了bottle.app(单线程,非阻塞I/O,单进程)
  2. uwsgi 或 gunicorn(后者更简单),通常设置为单线程、多进程(工作者)
  3. uwsgi前面的nginx。

如果您有想要提供的静态资产,那么 3 是最重要的,因为您可以直接使用 nginx 提供这些资产。
2 真的很容易上手(尤其是 gunicorn)——尽管我大部分时间都使用 uwsgi,因为它具有更多的可配置性来处理我想要的一些事情。
1 真的很简单而且性能很好……而且没有外部配置或命令行标志要记住。

于 2013-08-01T23:05:09.693 回答
8

2017 更新 - 我们现在使用 Falcon 而不是 Bottle

我仍然喜欢 Bottle,但我们在去年达到了一个点,它无法扩展以满足我们的性能要求(100k 请求/秒,<100ms)。特别是,我们遇到了 Bottle 使用线程本地存储的性能瓶颈。这迫使我们改用Falcon,从那以后我们就再也没有回头。更好的性能和精心设计的 API。

我喜欢 Bottle 但我也强烈推荐Falcon,尤其是在性能很重要的地方。


大约一年前,我面临一个类似的选择——我正在构建的服务器层需要一个 Web 微框架。发现这些幻灯片(以及随附的讲座)对于筛选选择领域非常有帮助:Web 微框架 BATTLE!

我选择了 Bottle 并且对它非常满意。它简单、轻量(如果您在 Raspberry Pis 上部署,这是一个加分项)、易于使用、直观,具有我需要的功能,并且在我需要添加自己的功能时具有极高的可扩展性。 许多插件可用。

不要将 Bottle 的内置 HTTP 服务器用于开发以外的任何东西。

我在生产环境中运行 Bottle 并取得了很大的成功;它在 Apache/mod_wsgi 上非常稳定。nginx/uwsgi“应该”工作类似,但我没有这方面的经验。

于 2013-08-02T11:16:41.167 回答
2

我还建议您通过 gevent.pywsgi 服务器查看运行瓶。它很棒,设置超级简单,异步且非常快。

Plus 瓶子已经为它制造了一个适配器,所以更容易。

我喜欢瓶子,这个不适合大型项目的概念是荒谬的。它是最有效且编写良好的框架之一,无需大量手动操作即可轻松成型。

于 2018-03-07T23:40:21.577 回答