淺談五大Python Web框架

轉載:http://feilong.me/2011/01/talk-about-Python-web-frameworkphp

說到Web Framework,Ruby的世界Rails一統江湖,而Python則是一個百花齊放的世界,各類micro-framework、framework不計其數,不徹底列表見:html

http://wiki.python.org/moin/WebFrameworkspython

雖然另外一大腳本語言PHP也有很多框架,但遠沒有Python這麼誇張,也正是由於Python Web Framework(Python Web開發框架,如下簡稱Python框架)太多,因此在Python社區總有關於Python框架孰優孰劣的話題,討論的時間跨度甚至長達3-5年。web

Python這麼多框架,能挨個玩個遍的人很少,坦白的說我也只用過其中的三個開發過項目,另一些稍微接觸過,因此這裏只能淺談一下,歡迎懂行的朋友們補充。數據庫

Djangodjango

                                                                                               

Python框架雖說是百花齊放,但仍然有那麼一家是最大的,它就是Django。要說Django是Python框架裏最好的,有人贊成也有人 堅定反對,但說Django的文檔最完善、市場佔有率最高、招聘職位最多估計你們都沒什麼意見。Django爲人所稱道的地方主要有:編程

完美的文檔,Django的成功,我以爲很大一部分緣由要歸功於Django近乎完美的官方文檔(包括Django book)。flask

全套的解決方案,Django象Rails同樣,提供全套的解決方案(full-stack framework + batteries included),基本要什麼有什麼(好比:cache、session、feed、orm、geo、auth),並且所有Django本身造,開發網 站應手的工具Django基本都給你作好了,所以開發效率是不用說的,出了問題也算好找,不在你的代碼裏就在Django的源碼裏。服務器

強大的URL路由配置,Django讓你能夠設計出很是優雅的URL,在Django裏你基本能夠跟醜陋的GET參數說拜拜。session

自助管理後臺,admin interface是Django裏比較吸引眼球的一項contrib,讓你幾乎不用寫一行代碼就擁有一個完整的後臺管理界面。

系統緊耦合,若是你以爲Django內置的某項功能不是很好,想用喜歡的第三方庫來代替是很難的,好比下面將要說的ORM、Template。要在Django裏用SQLAlchemy或Mako幾乎是不可能,即便打了一些補丁用上了也會讓你以爲很是很是彆扭。

Template功能比較弱,不能插入Python代碼,要寫複雜一點的邏輯須要另外用Python實現Tag或Filter。關於模板這一點,一直以來爭論比較多,最近有兩篇關於Python模板的比較有意思的文章可供參考:

1 http://pydanny.blogspot.com/2010/12/stupid-template-languages.html(需FQ)
2 http://techspot.zzzeek.org/2010/12/04/in-response-to-stupid-template-languages/

 

URL配置雖然強大,但所有要手寫,這一點跟Rails的Convention over configuration的理念徹底相左,高手和初識Django的人配出來的URL會有很大差別。

數據庫schema都給你定好了,這樣問題就來了,好比不少網站要求email地址惟一,可schema裏這個字段的值不是惟一的,糾結是必須的了。

總的來講,Django大包大攬,用它來快速開發一些Web運用是很不錯的。若是你順着Django的設計哲學來,你會以爲Django很好用,越用越順手;相反,你若是不能融入或接受Django的設計哲學,你用Django必定會很痛苦,趁早放棄的好。因此說在有些人眼裏Django無異於仙丹, 但對有一些人來講它又是毒藥且劇毒。

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和repoze.bfg的融合可能會催生下一個能挑戰Django地位的框架。

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。

一個框架精簡的好處在於你能夠聚焦在業務邏輯上,而不用太多的去關心框架自己或受框架的干擾,同時缺點也很明顯,許多事情你得本身操刀上。

我我的比較偏好這種精簡的框架,由於你很容易經過閱讀源碼弄明白整個框架的工做機制,若是框架那一塊不是很合意的話,我徹底能夠Monkey patch一下按本身的要求來。

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同樣,能夠跟Jinja二、SQLAlchemy之類結合的很好。

不過目前不論是Bottle仍是Flask成功案例都還不多。

Quixote

之因此要特別說一下Quixote,是由於國內的最大的用Python開發的網站「豆瓣網」是用Quixote開發的。我只簡單翻了一下源代碼,沒有作過研究,不發表評論,有經驗的來補充下。我只是在想,若是豆瓣網交到如今來開發,應該會有更多的選擇。

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

最後關於框架選擇的誤區

 

在框架的選擇問題上,許多人很容易就陷入了下面兩個誤區中而不自知:

1. 哪一個框架最好——世上沒有最好的框架,只有最適合你本身、最適合你的團隊的框架。編程語言選擇也是一個道理,你的團隊Python最熟就用Python好了,若是最熟悉的是Ruby那就用Ruby好了,編程語言、框架都只是工具,能多、快、好、省的幹完活就是好東西。

2. 過度關注性能——其實大部分人是不必太關心框架的性能的,由於你開發的網站根本就是個小站,能上1萬的IP的網站已經很少了,上10萬的更是不多不多。在沒有必定的訪問量前談性能實際上是沒有多大意義的,由於你的CPU和內存一直就閒着呢。並且語言和框架通常也不會是性能瓶頸,性能問題最常出如今數據庫訪問和文件讀寫上。 PHP的Zend Framework是出了名的慢,可是Zend Framework同樣有大站,如:digg.com;常被人說有性能問題的Ruby和Rails,不是照樣能夠開發出twitter嗎?再者如今的硬 件、帶寬成本實際上是很低的,特別有了雲計算平臺後,人力成本纔是最貴的,沒有上萬的IP根本就不用太在乎性能問題,流量上去了花點錢買點服務器空間好了, 簡單快速的解決性能問題。

注:前面有網友質疑我「Quora是用Pylons開發的」這樣的說法不客觀,特說明一下,這裏所說的某個網站A是用B開發的,只是指A主要或部分是由B開發的,你們就不要再去糾結A還用C了。

相關文章
相關標籤/搜索