Pythonweb框架五大浅谈转载:http://feilong.me/2011/01/talk-about-Python-web-frameworkPython,另一方面,是一个充满鲜花的世界。有无数的微框架和框架。不完整列表见:http://wiki.python.org/moin/WebFrameworks另一种主要的脚本语言PHP虽然也有很多框架,但远没有Python那么夸张,正是因为有太多PythonWebFrameworks(PythonWebdevelopmentframeworks,以下简称Pythonframeworks)众多,所以在Python社区中总是有关于Python框架优缺点的话题,讨论的时间跨度更是久远。长达3-5年。Python的框架那么多,能够一一玩转的人不多。坦白说,我只用过其中三个开发过项目,其他一些也接触过一点,这里只能说说。欢迎有识之士补充。虽然说DjangoPython框架百花齐放,但是最大的还是有一个,它就是Django。要说Django是Python框架中最好的,有人认同也有人坚决反对,但估计Django的文档最全,市场占有率最高,职位空缺最多。Django为人所知的主要是:完善的文档,Django的成功,我想很大一部分原因是因为Django近乎完美的官方文档(包括Djangobook)。全套解决方案,像Rails,Django提供全套解决方案(full-stackframework+batteriesincluded),基本上你需要的都有(比如:cache,session,feed,orm,geo,auth),和所有Django本身Django这个建站开发得心应手的工具基本都给你准备好了,开发效率不用多说,出了问题也很容易找到。如果它不在你的代码中,它就在Django的源代码中。通过强大的URL路由配置,Django可以让你设计出非常优雅的URL。在Django中,你基本上可以告别丑陋的GET参数。自助式管理后台,admin界面是Django中一个引人注目的contrib,它让你几乎不用写一行代码就可以拥有一个完整的后台管理界面。系统是紧耦合的。如果你觉得Django的某个内置功能不是很好,很难用喜欢的第三方库来替代,比如下面会提到的ORM和Template。在Django中使用SQLAlchemy或Mako几乎是不可能的,即使打上一些补丁,也会让你感觉非常非常别扭。Template功能比较弱,无法插入Python代码。如果要写更复杂的逻辑,需要用Python实现Tag或Filter。关于模板的争论很多。最近有两篇关于Python模板的有趣文章可以参考:1http://pydanny.blogspot.com/2010/12/stupid-template-languages.html(翻墙)2http://techspot.zzzeek.org/2010/12/04/in-response-to-stupid-template-languages/URL配置功能强大,但必须全部手写,这与RailsConventionover配置的概念完全不同,分配的URL高手和刚接触Django的人会有很大的不同。数据库模式已经为你设置好了,所以问题就出现了。比如很多网站要求邮箱地址唯一,但是schema中这个字段的值不唯一,纠缠是必要的。总的来说,Django提供的东西很多,用它来快速开发一些web应用是非常不错的。如果你遵循Django的设计理念,你会觉得Django非常好用,而且越用越方便;相反,如果你不能融入或接受Django的设计理念,你使用Django会非常痛苦,还不如趁早放弃。所以在一些人看来,Django无异于灵丹妙药,但对于一些人来说却是毒药,剧毒。Pylons&TurboGears&repoze.bfg除了Django,另一个大头就是Pylons,因为TurboGears2.x是基于Pylons的,在Pylons项目中repoze.bfg也被纳入到这个大项目中,TurboGears就不会了稍后单独讨论,repoze.bfg也是如此。Pylons和Django的设计理念完全不同。Pylons本身只有2000行左右的Python代码,但它还附带了一些几乎被Pylons使用的第三方模块。Pylons只提供一个架子和可选的解决方案。你可以根据自己的喜好自由选择Template、ORM、form、auth等组件。该系统是高度可定制的。我们常说Python是一种胶水语言(gluelanguage),那么我们可以说Pylons是一种用胶水语言设计的胶水框架。选择Pylons主要是选择它的自由度。选择自由也意味着你选择了噩梦:学习噩梦,Pylons依赖很多第三方库,不是Pylons做出来的,你在学习Pylons的同时还要学习这些库如何使用,关键是有时候你不会知道你想学什么。Pylons的学习曲线相对于Django高很多,Pylons的官方文档一直是被诟病的对象。幸运的是,后来出版了《TheDefinitiveGuidetoPylons》这本书,改变了这种情况。为此,Pylons一度被誉为只适合高手的Python框架。调试噩梦,因为涉及的模块很多,一旦出错,更难定位问题。可能是你写的程序的问题,也可能是Pylons的错误,也可能是SQLAlchemy的错误,也可能是formencode有bug,反正很乱。这个问题只有非常熟悉才能解决。Pylons和repoze.bfg的融合可能会诞生下一个可以挑战Django地位的框架。Tornado&web.pyTornado是一个Web服务器(本文不做详细介绍),也是一个和web.py一样的微框架。Tornado作为框架的思想主要来源于Web.py。大家在Web.py网站的首页上,也能看到Tornado的负责人BretTaylor(他这里提到的FriendFeed使用的框架,可以看做是Tornado一个东西)的这么一段话:“[web.py启发了我们在FriendFeed使用的Web框架[和]AppEngine附带的webapp框架……”由于这种关系,Tornado将在后面单独讨论。精简框架的好处是,你可以专注于业务逻辑,而不必太在意框架本身,也不必被框架打扰。同时,劣势也很明显。你必须自己做很多事情。我个人比较喜欢这种精简的框架,因为通过阅读源码可以很容易地理解整个框架的工作机制。如果框架不是很满意,我可以根据自己的需求进行monkeypatch。Bottle&Flask Bottle和Flask是新一代Python框架的代表。有意思的是,他们都使用装饰器来配置URL路由,比如:frombottleimportroute,run@route('/:name')defindex(name='World'):return'Hello%s!'%namerun(host='localhost',port=8080)Bottle和Flask和web.py一样非常精简,Bottle甚至所有的代码都在一个两千行的.py文件中。另外,Flask和Pylons一样,可以和Jinja2、SQLAlchemy等很好的结合。但是,Bottle或Flask的成功案例还是很少。Quixote之所以特别想说Quixote,是因为国内用Python开发的最大网站“豆瓣”就是用Quixote开发的。只是简单的翻了一下源码。我没有做过任何研究,所以我不想发表评论。有经验的会补充的。我只是在想,如果豆瓣现在发展起来,应该会有更多的选择。其他(web2py,uliweb,Karrigell,Werkzeug...)最后,关于框架选择的误区在框架的选择上,很多人很容易在不知不觉中陷入以下两个误区:哪个框架最好——有世界上没有最好的框架,好的框架只有最适合你和你的团队的。编程语言的选择也是一样的。如果您的团队最熟悉Python,请使用Python。如果您最熟悉Ruby,请使用Ruby。编程语言和框架只是工具。完成是一件好事。过分关注性能——其实大多数人不需要过分关心框架的性能,因为你开发的网站只是一个小网站,能达到10000IP的网站并不多,而要达到10万个IP就更难了。很少。没有一定的访问量再谈性能意义不大,因为你的CPU和内存总是闲置的。而且,语言和框架一般都不是性能瓶颈,性能问题最常出现在数据库访问和文件读写上。PHP的ZendFramework是出了名的慢,但是ZendFramework也有大网站,比如:digg.com;经常被人说性能有问题的Ruby和Rails,还能开发twitter吗?此外,目前的硬件和带宽成本其实很低。尤其是有了云计算平台,人工成本是最贵的。如果你没有几万个IP,就不用太担心性能问题。如果流量上去了,花点钱买一些服务器空间就好了,性能问题也能简单快速的解决。注:有网友质疑我所说的“Quora是用Pylons开发的”不客观。说明一下,这里说的某网站A是用B开发的,但意思是A主要或部分是由B开发的,大家不要再为A和C操心了。
