前言

这是一篇发在知乎专栏的文章,内容是之前我提的「(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和它并没有什么优势。