说到web framework,Ruby的世界Rails一统江湖,而Python则是一个百花齐放的世界,各种micro-framework、framework不可胜数,不完全列表见:http://wiki.python.org/moin/WebFrameworks。虽然另一大脚本语言PHP也有不少框架,但远没有Python这么夸张,也正是因为Python web framework(Python web开发框架,以下简称Python框架)太多,所以在Python社区总有关于Python框架孰优孰劣的话题,讨论的时间跨度甚至长达3-5年。

Python这么多框架,能挨个玩个遍的人不多,坦白的说我也只用过其中的三个开发过项目,另外一些稍微接触过,所以这里只能浅谈一下,欢迎懂行的朋友们补充、拍砖。

Django

Python框架虽然说是百花齐放,但仍然有那么一家是最大的,它就是Django。要说Django是Python框架里最好的,有人同意也有人坚决反对,但说Django的文档最完善、市场占有率最高、招聘职位最多估计大家都没什么意见。Django为人所称道的地方主要有:

  • 完美的文档,Django的成功,我觉得很大一部分原因要归功于Django近乎完美的官方文档(包括Django book)。
  • 全套的解决方案,Django象Rails一样,提供全套的解决方案(full-stack framework + batteries included),基本要什么有什么(比如:cache、session、feed、orm、geo、auth),而且全部Django自己造,开发网站应手的工具Django基本都给你做好了,因此开发效率是不用说的,出了问题也算好找,不在你的代码里就在Django的源码里。
  • 强大的URL路由配置,Django让你可以设计出非常优雅的URL,在Django里你基本可以跟丑陋的GET参数说拜拜。
  • 自助管理后台,admin interface是Django里比较吸引眼球的一项contrib,让你几乎不用写一行代码就拥有一个完整的后台管理界面。

而Django的缺点主要源自Django坚持自己造所有的轮子,整个系统相对封闭,Django最为人诟病的地方有:

  • 系统紧耦合,如果你觉得Django内置的某项功能不是很好,想用喜欢的第三方库来代替是很难的,比如下面将要说的ORM、Template。要在Django里用SQLAlchemy或Mako几乎是不可能,即使打了一些补丁用上了也会让你觉得非常非常别扭。
  • Django自带的ORM远不如SQLAlchemy强大,除了在Django这一亩三分地,SQLAlchemy是Python世界里事实上的ORM标准,其它框架都支持SQLAlchemy了,唯独Django仍然坚持自己的那一套。Django的开发人员对SQLAlchemy的支持也是有过讨论和尝试的,不过最终还是放弃了,估计是代价太高且跟Django其它的模块很难合到一块。
  • Template功能比较弱,不能插入Python代码,要写复杂一点的逻辑需要另外用Python实现Tag或Filter。关于模板这一点,一直以来争论比较多,最近有两篇关于Python模板的比较有意思的文章可供参考:
  1. http://pydanny.blogspot.com/2010/12/stupid-template-languages.html(需翻墙)
  2. http://techspot.zzzeek.org/2010/12/04/in-response-to-stupid-template-languages/
  • URL配置虽然强大,但全部要手写,这一点跟Rails的Convention over configuration的理念完全相左,高手和初识Django的人配出来的URL会有很大差异。
  • 让人纠结的auth模块,Django的auth跟其它模块结合紧密,功能也挺强的,就是做的有点过了,用户的数据库schema都给你定好了,这样问题就来了,比如很多网站要求email地址唯一,可schema里这个字段的值不是唯一的,纠结是必须的了。
  • Python文件做配置文件,而不是更常见的ini、xml或yaml等形式。这本身不是什么问题,可是因为理论上来说settings的值是能够动态的改变的(虽然大家不会这么干),但这不是最佳实践的体现。

总的来说,Django大包大揽,用它来快速开发一些Web运用是很不错的。如果你顺着Django的设计哲学来,你会觉得Django很好用,越用越爽;相反,你如果不能融入或接受Django的设计哲学,你用Django一定会很痛苦,趁早放弃的好。所以说在有些人眼里Django无异于仙丹,但对有一些人来说它又是毒药且剧毒。

Django案例有disqus.combitbucket.org海报网等。

Pylons & TurboGears & repoze.bfg

除了Django另一个大头就是Pylons了,因为TurboGears2.x是基于Pylons来做的,而repoze.bfg也已经并入Pylons project里这个大的项目里,后面不再单独讨论TurboGears和repoze.bfg了。

Pylons和Django的设计理念完全不同,Pylons本身只有两千行左右的Python代码,不过它还附带有一些几乎就是Pylons御用的第三方模块。Pylons只提供一个架子和可选方案,你可以根据自己的喜好自由的选择Template、ORM、form、auth等组件,系统高度可定制。我们常说Python是一个胶水语言(glue language),那么我们完全可以说Pylons就是一个用胶水语言设计的胶水框架:)

选择Pylons多是选择了它的自由,选择了自由的同时也预示着你选择了噩梦:

  • 学习噩梦,Pylons依赖于许多第三方库,它们并不是Pylons造,你学Pylons的同时还得学这些库怎么使用,关键有些时候你都不知道你要学什么。Pylons的学习曲线相对比Django要高的多,而之前Pylons的官方文档也一直是人批评的对象,好在后来出了The Definitive Guide to Pylons这本书,这一局面有所改观。因为这个原因,Pylons一度被誉为只适合高手使用的Python框架。
  • 调试噩梦,因为牵涉到的模块多,一旦有错误发生就比较难定位问题处在哪里。可能是你写的程序的错、也可能是Pylons出错了、再或是SQLAlchemy出错了、搞不好是formencode有bug,反正很凌乱了。这个只有用的很熟了才能解决这个问题。
  • 升级噩梦,安装Pylons大大小小共要安装近20个Python模块,各有各自的版本号,要升级Pylons的版本,哪个模块出了不兼容的问题都有可能,升级基本上很难很难。至今reddit的Pylons还停留在古董的0.9.6上,SQLAlchemy也还是0.5.3的版本,应该跟这条有关系。所以大家玩Pylons一定要结合virtualenv来玩,给自己留条后路,不然会死得很惨。

Pylons和repoze.bfg的融合可能会催生下一个能挑战Django地位的框架。

Pylons的案例有reddit.comdropbox.comquora.com等。

Tornado & web.py

Tornado即是一个web server(对此本文不作详述),同时又是一个类web.py的micro-framework,作为框架Tornado的思想主要来源于web.py,大家在web.py的网站首页也可以看到Tornado的大佬Bret Taylor的这么一段话(他这里说的FriendFeed用的框架跟Tornado可以看作是一个东西):

“[web.py inspired the] web framework we use at FriendFeed [and] the webapp framework that ships with App Engine…”

因为有这层关系,后面不再单独讨论Tornado。

web.py的设计理念力求精简(Keep it simple and powerful),总共就没多少行代码,也不像Pylons那样依赖大量的第三方模块,而是只提供的一个框架所必须的一些东西,如:URL路由、Template、数据库访问,其它的就交给用户自己去做好了。

一个框架精简的好处在于你可以聚焦在业务逻辑上,而不用太多的去关心框架本身或受框架的干扰,同时缺点也很明显,许多事情你得自己操刀上。
我个人比较偏好这种精简的框架,因为你很容易通过阅读源码弄明白整个框架的工作机制,如果框架那一块不是很合意的话,我完全可以Monkey patch一下按自己的要求来。

早期的reddit是用web.py写的,Tornado的案例有friendfeed.combit.lyquora.com和我的开源站点poweredsites.org等。

Bottle & Flask

Bottle和Flask作为新生一代Python框架的代表,挺有意思的是都采用了decorator的方式配置URL路由,如:

from bottle import route, run
 
@route('/:name')
def index(name='World'):
    return '<b>Hello %s!</b>' % name
 
run(host='localhost', port=8080)

Bottle、Flask跟web.py一样,都非常精简,Bottle甚至所有的代码都在那一个两千来行的.py文件里。另外Flask和Pylons一样,可以跟Jinja2、SQLAlchemy之类结合的很好。

不过目前不管是Bottle还是Flask成功案例都还很少。

Quixote

之所以要特别说一下Quixote,是因为国内的最大的用Python开发的网站“豆瓣网”是用Quixote开发的。我只简单翻了一下源代码,没有做过研究,不发表评论,有经验的来补充下。我只是在想,如果豆瓣网交到现在来开发,应该会有更多的选择。

其它(web2py、uliweb、Karrigell、Werkzeug …)

欢迎大家补充…

最后关于框架选择的误区

在框架的选择问题上,许多人很容易就陷入了下面两个误区中而不自知:

  1. 哪个框架最好 - 世上没有最好的框架,只有最适合你自己、最适合你的团队的框架。编程语言选择也是一个道理,你的团队Python最熟就用Python好了,如果最熟悉的是Ruby那就用Ruby好了,编程语言、框架都只是工具,能多、快、好、省的干完活就是好东西,管TMD是日本鬼子还是美帝造呢!
  2. 过分关注性能 - 其实大部分人是没必要太关心框架的性能的,因为你开发的网站根本就是个小站,能上1万的IP的网站已经不多了,上10万的更是很少很少。在没有一定的访问量前谈性能其实是没有多大意义的,因为你的CPU和内存一直就闲着呢。而且语言和框架一般也不会是性能瓶颈,性能问题最常出现在数据库访问和文件读写上。PHP的Zend Framework是出了名的慢,但是Zend Framework一样有大站,如:digg.com;常被人说有性能问题的Ruby和Rails,不是照样可以开发出twitter吗?再者现在的硬件、带宽成本其实是很低的,特别有了云计算平台后,人力成本才是最贵的,没有上万的IP根本就不用太在意性能问题,流量上去了花点钱买点服务器空间好了,简单快速的解决性能问题。

注:前面有网友质疑我“Quora是用Pylons开发的”这样的说法不客观,特说明一下,这里所说的某个网站A是用B开发的,只是指A主要或部分是由B开发的,大家就不要再去纠结A还用C了。

转载请注明出处:http://feilong.me/2011/01/talk-about-python-web-framework


你可能还喜欢:

  1. Python web开发吐槽
  2. 说说Python获年度Tiobe编程语言大奖这事
  3. 用Tornado开发RESTful API运用
  4. Tornado对子域名和泛域名的支持
  5. [小技巧]如何在开发测试和生产环境下跑同一套Python代码

79 回应 到 “浅谈Python web框架”

评论 (48) Pingbacks (31)
  1. 有一点我一直不太明白,web.py和web2py这两个有没有关系?

  2. 我喜欢web.py :|

  3. Python为什么会有这么多框架?这个问题值得深思。

  4. 赞同web.py的设计思想,如果精通python,就像脱缰的野马!至于Django的ORM Template功能比较弱,不敢苟同!

    • 我这博客就是希望各位各抒己见,这样才有讨论的气氛。Django确实有人喜欢又有人恨,它的模板设计哲学是有它的道理,对于页面设计和后端开发分工明确的团队是很好的,但是对于像我这样网站开发从头到脚都管的,则喜欢mako或Tornado的模板这样的可以直接嵌入Python代码。

      • 个人觉得python嵌套太多HTML,或HTML嵌套太多的python代码,整体代码变得不雅观!页面设计师或程序设计师在专属领域的维护度都降低了!Django这么做正是为了让专人各司其职,可谓是一箭双雕!网站开发从头到脚都管的人,更需要这样维护度更高的特征吧?

        • 我这种因为前后端都会,所以在写模板的逻辑的时候比较喜欢直接用Python代码,而不是转个弯去写Tag或Filter,从软件的可维护性来说这是不好的实践,但从开发效率上来说,这样是有优势的。其实说白了Django和Mako这两类模板,一个是在Python代码里嵌入HTML,而另一个则是在HTML里嵌入Python代码,没有谁对谁错,只有哪个更适合你自己 :smile:

  5. 框架总有不便的地方,在复杂的项目上使用总是不顺手。因此根据WSGI标准,自已造轮子了。

  6. 多谢博主分享,刚接触web.py。

    • 为什么不看看 bottle? 不过资料是少了些

      • bottle直接研究源码好了,就一个文件且只有2000多行(带空行和注释)

        • @飞龙老大
          刚开始学习python,想要配合着找个web框架做实验学习,请问选择哪个好点?
          web.py? bottle? flask???

          能专门介绍下这三个框架的优缺点吗? 因为以后做的网站也是要在这三个框架里面选择。 谢谢了

          • 你不只是玩玩学习学习,后面要开发网站的话,且只在这三个中选的话,我建议你用flask。

          • 内给介绍下这三个框架的优缺点吗? 如果让你在所有的py框架中选择的话,你会选择那个???

            py的框架实在是太多了,想要找一个稳定而且性能高的框架,当然 最好不要太臃肿…

            现在的网站是使用php写的,在想要转到python,对几个py框架作比较后发现web.py bottle flask这三个框架性能最高………………

          • 论性能肯定是Tornado啦,但Tornado对新手入手稍微困难些,我个人也是偏好Tornado的。

        • 我刚开始学python语言,准备做个简单的企业网站,主要用来展示公司的产品,网站内容大部都是静态页面.就只有一个在线客服的功能.因为我们是个小公司,网站全部内容都由我一个人来搞,网站要放在GAE上面.
          想请教飞龙博主,我应该选择哪个框架比较合适.

  7. 刚学django,感觉,很好。
    就如同python语言一样,够简洁,但是不简单.
    其实可以谈一谈 zope,不过貌似国内研究zope的人很少。中文文档也写得极其简略..给人一个概念就是不适宜新手…..
    我总认为,zope不可能复杂过JAVA的SSH.只是可能这方面做的推广少了吧……

    • 国内研究使用Zope的我知道的不多,不过潘俊勇同学研究的比较多,他的易度everydo.com就是用Zope3做的。

      作为Zope的元老之一Chris McDonough和一帮人后来搞了一个repoze项目,力图把Zope的一些好的东西剥离出来,可以放到WSGI这个大的框架下来用,他们也确实做到了,repoze.bfg、repoze.who、repoze.what就是repoze的产物,这些东西身上都有很强的Zope的影子(主要是interface),而repoze.bfg更是并入了Pylons,成为新的Pylons项目的核心部分Pyramid,这些都是Zope的好的东西的延续。

  8. Zope也值得讨论一下

  9. 分析的不错啊,楼主哪里高就?

  10. 正在用pylons做项目,的确如博主所言
    各种框架分析的挺到位,谢谢

  11. 请问flask适合初学者吗? flask web.py tornado 哪个适合初学者开始第一个框架。
    谢谢!很希望得到您的建议。

    • Flask可以类比一个文档非常健全的Pylons,即虽然是微框架,但它依赖于不少外部的包,不过文档比Pylons强的多,相对易学习些,但我不认为它适合初学者;

      而最早采用web.py的reddit早已使用pylons改造了整站,比较有意思的是reddit后台的服务器一度都是friendfeed server,friendfeed server和tornado是同源于friendfeed,这两者可以看作是一个东西;

      但tornado的web部分是优化了的web.py,reddit的创始人之一现在跑出去自己另搞,开发的网站采用的是tornado,但是tornado也不太适合初学者,因为文档多在代码里,要自己去挖掘。

      对于Python web开发的初学者来说,学习哪一种框架并不太重要,你首先要学习的是Python WSGI、HTML、Javascript、CSS等知识,后三者跟Python没有直接的关系,而WSGI则是Python的Web标准,适用于Python框架、Python服务器和中间件,懂了这个,Python的框架原理也就通了,你再挑一个感兴趣的框架来学习不迟。

  12. 这些天看了好多python web framework的东西,因为有个项目要用,但以前没用过,这篇文章让我倾向于pylons。
    我们的项目需要有以下的功能:
    OAth,RESTful,ORM(倾向于sqlalchemy),timing(schedule)的功能,飞龙认为哪个更合适呢?谢谢

    • 不知道Pyramid和Pylons在这些方面差别大不大,或曰Pyramid与Pylons的差别,看起来pylons的文档更清晰

      • Pyramid虽然现在是新的PylonsProject的一部分,但它是原来的repoze.bfg,而不是之前的Pylons,所以还是有不小的差异的,但是老版的Pylons已经不再更新了,不再建议去采用了。基于你的需求(OAuth,RESTful,ORM,timing),我觉得Tornado可能最合适,因为除了ORM另外三个需求Tornado都内置就支持,而且很强大,如果要在Tornado中用SQLAlchemy的话,其实也是一件很容易的事情,把Pylons创建好的项目的一些SQLALchemy相关的代码移植过来即可。

  13. Your post is really good and informative. I’m surprised that your post has not gotten any good quality, genuine comments. You have done a great job by posting this article.Thanks.

  14. 你好!
    请教下,想用 Python 做个博客,用什么框架会比较合适?
    要支持 Python 3 的,入门难度高没有关系。

  15. python新手,正纠结该用啥框架写个网站玩,看了博主的文章觉得还是用web.py更适合我

  16. web.py的文档太烂,想解决问题得去看源码。

  17. 比较中肯的介绍.学习了.

  18. flask的成功案例有:www.gongju.com

  19. 你是在v2ex上招小弟的那位?

  20. 你好!
    刚接触web开发,学了些HTML,CSS, JS的皮毛。
    我想自己做一个简单的web app,可以兼学习和为工作做准备(开发web测试工具),
    请问我选用django框架会不会太重了?
    您可以给我推荐一个比较好的入门和拓展性好的框架么?谢谢!

回复

(必须)

(必须)

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="">

icon_wink.gif icon_neutral.gif icon_mad.gif icon_twisted.gif icon_smile.gif icon_eek.gif icon_sad.gif icon_rolleyes.gif icon_razz.gif icon_redface.gif icon_surprised.gif icon_mrgreen.gif icon_lol.gif icon_idea.gif icon_biggrin.gif icon_evil.gif icon_cry.gif icon_cool.gif icon_arrow.gif icon_confused.gif icon_question.gif icon_exclaim.gif 

© 2012 飞龙博客
Suffusion theme by Sayontan Sinha

飞龙非龙 使用的缓存程序为 WP Super Cache

Dang tin mua ban Thuong mai dien tu Quang cao truc tuyen