前言

这是一篇发在 知乎专栏的文章 ,内容是之前我提的「(2017)你最不建议使用的 Python Web 框架?」下的回答。不过有些话没有说完,比如不建议 tornado,却没有说对 asyncio 的看法,由于它的热度过去了我也没有补充,今天就发在公众号下吧。

在知乎可以看到的很多 Web 框架推荐,有很多内容已经过时,有些直接是从网上搜的,自己根本没有真的用过,不知道推荐的时候他们的良心会不会痛,不过幸好有我来树立正确的价值观了。

第一不推荐 web.py

我以前说过,评价 XX 是否可以用在生产环境的一部分标准是:

  1. 代码质量。web.py 的创始人 Aaron Swartz 自杀(官方说法)后,新的维护者能力实在是...

  2. 社区活跃程度和解决 issue 的能力。自己去 github 上去看未解决的 issue 和未合并的 pull request 数量

  3. 项目迭代情况。webpy-0.37 on Jun 26, 2012,webpy-0.38 on Jul 8, 2016。到现在一年就这样过去了然鹅什么都还没有发生。

第二不推荐 bottle

bottle 其实是第一个使用装饰器作为路由的框架,不过它也存在社区活跃程度和解决 issue 的能力的问题,其实这说明了一个问题,它更像是某个(些)人的玩具,并不关心用户反馈。不知道大家是否知道它和 Flask 的故事(简单的说 Flask 的作者 Armin Ronacher 开发了 Werkzeug 推荐给 Bottle 作者,但是 Bottle 作者非常执着于 “单文件” 和 “无依赖”,拒绝了使用 Werkzeug,Armin Ronacher 就自己写了 Flask),如果 3-4 年前你选择 bottle 我也是没意见的,现在来看 Flask 完爆它,哪怕是自己写的 demo,你说你用了一个不适合在生产环境中使用框架的意义在哪里?完全没有积累啊。不过客观的说读源码学习写框架倒是可以的

第三不推荐 tornado

别说知乎也在用,用得好不好,用的有多苦他们自己知道 ✧(≖ ◡ ≖✿)。这个就跟豆瓣用 Quixote 一样,用下来需要造很多轮子,需要很多积累,并不是别人一朝一夕就能用的成熟的。

非常知名的 Python Guide 列了 4 个框架,除了 Django 和 Flask,还列出了我刚推荐的 Pyramid,以及 tornado。bottle、web.py 什么的人家一概都不提。而且,我要说重点了,在介绍 tornado 的时候,Kenneth Reitz 着重的加了这样的观点:

I do not recommend using Tornado unless you think you need it.

为啥这样说啊?

  1. 使用一个框架不只是框架自己,还要习惯它的编程方式。并不是用了 tornado 你的应用就是异步非阻塞的,性能就能刷刷涨,各种设施都要支持。我见过不少人写的 tornado 代码还是阻塞的,比如我前公司的某项目... (๑✦ˑ̫✦)。

  2. 使用框架还需要考虑它的社区和第三方的扩展环境。tornado 的生态环境和 Django/Flask 根本就不是一个量级,质量也很差,指不上

  3. tornado 虽然确实可以当做 web 框架用,但是它优秀的地方在于它是一个异步的网络库,优势在扩展上 w 级别长连接上(相信一开始知乎就是考虑这点来做提醒)。这点要分清楚了。

前 2 天还好,但是第三条顿时引起了争议,我知道说话肯定没有 Kenneth Reitz 好使,所以引用他的话。其实犹之乎的同学来发表了意见,我还无意中发现,知乎产品总监来点了赞哦。嘻嘻,其实你真的写过复杂的 tornado 的项目就知道了,我不推荐的原因正面的讲:

  1. tornado 对于刚起步的公司或者新学 Web 框架的同学来说不合适。一处阻塞,全局阻塞,这对开发者的要求是很高的,我在 14 年的时候就想过做一个质量保证的工具,但是思考了一下,AST 模块对于业务逻辑是束手无策的,你看到现在也没有看到这样的东西。
  2. tornado 是 Python 2 的产物,现在有了更好的解决方案 asyncio。

那我们继续这个第二条:

我也是推荐至少学一个异步框架的,过去能看到的有 Gevent,Twisted,一个是 Hack 的,另外一个现在已经被打入了冷宫,到今天当然是不推荐的。那么最好的就是官方的 asyncio。

sanic/aiohttp 这种框架的前景是好的,只不过现在我还没有看见某大型产品使用它们的实践经验,asyncio 生态也还并不完善,暂不推荐进生产环境。

最后,你真的有需求要实现长连接,上 asyncio,对于一个从无到有的过程,tornado 和它并没有什么优势。