Web 框架介绍
Python 的 Web 框架可算是百花齐放,各种框架和微框架数不胜数,关于 Python 框架孰优孰劣的讨论一直没有间断过。这种争论给 Web 开发工程师们带来了很大的困扰,尤其对初中级的工程师来说,不知道如何选择。本节我们就来介绍当前知名的 Web 框架的特点及其应用场景。
主流 Web 框架
主流的 Web 框架有以下几种。
Django
Django 最初是被开发用来管理劳伦斯出版集团旗下一些以新闻内容为主的网站的,它以比利时的吉普赛爵士吉他手 Django Reinhardt 来命名,它和 Flask 是使用最广泛的 Python Web 框架。Django 能如此知名很大程度上是因为提供了非常齐备的官方文档,它提供了一站式的解决方案,包含缓存、ORM、管理后台、验证、表单处理等,使得开发复杂的数据库驱动的网站变得很简单。但正因为它坚持自己对于 Web 框架的理解,系统耦合度太高,替换掉内置的功能往往需要花费一些功夫,所以学习曲线也相当陡峭。
Flask
Flask 是一个轻量级 Web 应用框架,它基于 Werkzeug 实现的 WSGI 和 Jinja2 模板引擎。Flask 的作者是 Armin Ronacher,本来这只是作者愚人节开的一个玩笑,但是开源之后却受到 Python 程序员的喜爱,目前在 GitHub 上的 Star 数量已经超过了 Django。它的设计哲学和 Django 不同:只保留核心,通过扩展机制来增加其他功能。Flask 用到的依赖都是 Pocoo 团队开发的。Pocoo 团队其他的项目还有 Pygments、Sphinx、以及 lodgeit。Flask 的扩展环境非常繁荣,基本上 Web 应用的每个环节都有对应的扩展供选择,就算没有对应的扩展也能很方便地自己实现一个。
Pyramid
Pyramid 在国内知名度并不高,主要原因是中文文档匮乏,其高级用法需要通过阅读源代码获取灵感。尽管被 Django 和 Flask 的光芒遮蔽,但是它的性能要比 Flask 高。Pyramid 的灵感来源于 Zope、Pylons 1.0 和 Django。在我们的传统观点里,小框架通常牺牲了大框架的特色,反之亦然。但是事实上我们不能真正把控一个应用程序最终的发展情况,而 Pyramid 在努力朝着胜任不同级别应用的框架的方向在走。虽然它默认使用 Chameleon 和 Mako 模板,但很容易切换成 Jinja2,甚至可以让多种模板引擎共存,通过文件后缀名来识别。豆瓣赞赏和豆瓣钱包等产品就是基于此框架实现的,代码量级和 Flask 相同,性能比 Flask 要略高。
Bottle
Bottle 也是一个轻量级的 Web 框架。它的特点是单文件,代码只使用了 Python 标准库,而不需要额外依赖其他第三方库。它更符合微框架的定义,截止到今天只有 4100 多行的代码。
Tornado
Tornado 全称 Tornado Web Server,最初是由 FriendFeed 开发的非阻塞式 Web 服务器,现在我们看到的是被 Fackbook 收购后开源出来的版本。它和其他主流框架有个明显的区别:它是非阻塞式服务器,而且速度相当快。得益于其非阻塞的方式和对 epoll 的运用,Tornado 每秒可以处理数以千计的连接,这意味着对于长轮询、WebSocket 等实时 Web 服务来说, Tornado 是一个理想的 Web 框架。
Web.py
Web.py 也是一个微框架,由 Reddit 联合创始人、RSS 规格合作创造者、著名计算机黑客 Aaron Swartz 开发。Web.py 使用基于类的视图,简单易学却功能强大。
小众的 Web 框架
Quixote
Quixote 是由美国全国研究创新联合会(Corporation for National Research Initiatives,CNRI)的工程师 A.M.Kuchling、Neil Schemenauer 和 Greg Ward 开发的一个轻量级 Web 框架,它简单、高效、代码简洁。豆瓣的大部分用户产品都使用定制版的 Quixote 作为 Web 框架,虽说这有历史原因(当时 Django/Flask 等框架还没有出现),但是也证明这个始于 2000 年的框架是可以经受时间考验的。它使用目录式的 URL 分发规则,用 Python 来写模板。PTL 模板更适合程序员,但是并不适合美工参与前端代码的编写和修改,豆瓣在开发中使用了 Mako 替代 PTL。不建议在生产环境选用 Quixote。
Klein
Klein 是 Twisted 组织开源出来的基于 werkzeug 和 twisted.web 的微框架。Flask 很不错,但是不能使用异步非阻塞的方式编程,根本原因是它和 Django、Pyramid 一样,都基于 WSGI,而 WSGI 的接口是同步阻塞的。Klein 用法非常像 Flask,却可以使用异步的方式开发 Web 应用。
选择 Web 框架时应遵循的原则
介绍了这么多的框架,那么在工作中怎么选择呢?以下是笔者总结的一些原则:
1.选择更主流的框架。因为它们的文档更齐全,技术积累要更多,社区更繁盛,能得到更好的支持。
2.关注框架的活跃情况。关注项目的更新频率、Issue 和 Pull Request(在本书中都简称 PR)的响应情况。如果一个项目已经很长时间没有更新了,或者有一堆的问题需要解决但是没有得到回应,就不应该将这样的框架放在生产环境中。
3.确认选择的框架是否足够满足需求。没有最好的框架,只有最合适的框架。你所选择的 Web 框架不仅需要满足当前的需求,也要充分考虑项目发展一段时间之后的情况,即前瞻性。如果在做选择时有个人喜好这样的因素,需要确认自己有能力对选择的 Web 框架提供支持,避免盲目选择而导致将来推倒重来的情况。
4.注意媒体时效性。在做选择的时候可能会参考网络上的一些文章,但是需要注意其发表时间。举个例子,看了一篇 2012 年的博客,里面说应该选择 A 而不是 B,并给了多个理由。而现在的情形可能已经发生了变化:B 经过很久的努力已经做得更优秀或者 2012 年之后出现了更优秀的 C。
5.客观看待媒体的观点。媒体的观点并不一定是正确的(或者不是全部正确),如果不是官方的说明,就应该保持怀疑和谨慎的态度,取其精华去其糟粕,切勿完全拿来主义,应该真正做实践验证之后再做决定。
对于上述的 Web 框架,可以参考如下几条建议:
1.如果是为了供演示或者不太考虑长期发展,只是需要用到数据库的 CURD 操作、写 REST API 之类的简单型应用,框架的选择非常宽松,用着顺手的即可。
2.如果你初学 Web 框架,建议选择 Flask 作为入门框架,学习曲线相对 Django 而言要低很多。等熟悉 Flask 之后再学习 Django,就会容易很多。
3.Pyramid 和 Django 都是面向大型应用的,Pyramid 更灵活,开发者空间大得多,值得考虑。
4.网站性能出现问题时,往往问题不只出在 Web 框架和编程语言上,做选择时在环境中按实际产品逻辑测试一段时间即可得到结论,但是不要只相信看到的一些性能对比文章,尤其不要做无意义的 Hello World 级别的测试。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论