淺談五大Python Web框架導(dǎo)讀:作者飛龍寫了一篇《淺談Python Web框架》,文中他介紹了幾個Python Web框架和自己對選擇框架的分析。在他看來,用Django來快速開發(fā)一些Web運用是很不錯的選擇。以下是文章內(nèi)容: 說到Web Framework,Ruby的世界Rails一統(tǒng)江湖,而Python則是一個百花齊放的世界,各種micro-framework、framework不可勝數(shù),不完全列表見: http://wiki./moin/WebFrameworks。 雖然另一大腳本語言PHP也有不少框架,但遠沒有Python這么夸張,也正是因為Python Web Framework(Python Web開發(fā)框架,以下簡稱Python框架)太多,所以在Python社區(qū)總有關(guān)于Python框架孰優(yōu)孰劣的話題,討論的時間跨度甚至長達3-5年。 Python這么多框架,能挨個玩?zhèn)€遍的人不多,坦白的說我也只用過其中的三個開發(fā)過項目,另外一些稍微接觸過,所以這里只能淺談一下,歡迎懂行的朋友們補充。 Python框架雖然說是百花齊放,但仍然有那么一家是最大的,它就是Django。要說Django是Python框架里最好的,有人同意也有人 堅決反對,但說Django的文檔最完善、市場占有率最高、招聘職位最多估計大家都沒什么意見。Django為人所稱道的地方主要有: 完美的文檔,Django的成功,我覺得很大一部分原因要歸功于Django近乎完美的官方文檔(包括Django book)。 全套的解決方案,Django象Rails一樣,提供全套的解決方案(full-stack framework + batteries included),基本要什么有什么(比如:cache、session、feed、orm、geo、auth),而且全部Django自己造,開發(fā)網(wǎng) 站應(yīng)手的工具Django基本都給你做好了,因此開發(fā)效率是不用說的,出了問題也算好找,不在你的代碼里就在Django的源碼里。 強大的URL路由配置,Django讓你可以設(shè)計出非常優(yōu)雅的URL,在Django里你基本可以跟丑陋的GET參數(shù)說拜拜。 自助管理后臺,admin interface是Django里比較吸引眼球的一項contrib,讓你幾乎不用寫一行代碼就擁有一個完整的后臺管理界面。 而Django的缺點主要源自Django堅持自己造所有的輪子,整個系統(tǒng)相對封閉,Django最為人詬病的地方有: 系統(tǒng)緊耦合,如果你覺得Django內(nèi)置的某項功能不是很好,想用喜歡的第三方庫來代替是很難的,比如下面將要說的ORM、Template。要在Django里用SQLAlchemy或Mako幾乎是不可能,即使打了一些補丁用上了也會讓你覺得非常非常別扭。 Django自帶的ORM遠不如SQLAlchemy強大,除了在Django這一畝三分地,SQLAlchemy是Python世界里事實上的 ORM標準,其它框架都支持SQLAlchemy了,唯獨Django仍然堅持自己的那一套。Django的開發(fā)人員對SQLAlchemy的支持也是有 過討論和嘗試的,不過最終還是放棄了,估計是代價太高且跟Django其它的模塊很難合到一塊。 Template功能比較弱,不能插入Python代碼,要寫復(fù)雜一點的邏輯需要另外用Python實現(xiàn)Tag或Filter。關(guān)于模板這一點,一直以來爭論比較多,最近有兩篇關(guān)于Python模板的比較有意思的文章可供參考: URL配置雖然強大,但全部要手寫,這一點跟Rails的Convention over configuration的理念完全相左,高手和初識Django的人配出來的URL會有很大差異。 讓人糾結(jié)的auth模塊,Django的auth跟其它模塊結(jié)合緊密,功能也挺強的,就是做的有點過了,用戶的數(shù)據(jù)庫schema都給你定好了,這樣問題就來了,比如很多網(wǎng)站要求email地址唯一,可schema里這個字段的值不是唯一的,糾結(jié)是必須的了。 Python文件做配置文件,而不是更常見的ini、xml或yaml等形式。這本身不是什么問題,可是因為理論上來說settings的值是能夠動態(tài)的改變的(雖然大家不會這么干),但這不是最佳實踐的體現(xiàn)。 總的來說,Django大包大攬,用它來快速開發(fā)一些Web運用是很不錯的。如果你順著Django的設(shè)計哲學(xué)來,你會覺得Django很好用,越 用越順手;相反,你如果不能融入或接受Django的設(shè)計哲學(xué),你用Django一定會很痛苦,趁早放棄的好。所以說在有些人眼里Django無異于仙 丹, 但對有一些人來說它又是毒藥且劇毒。 Pylons & TurboGears & repoze.bfg 除了Django另一個大頭就是Pylons了,因為TurboGears2.x是基于Pylons來做的,而repoze.bfg也已經(jīng)并入Pylons project里這個大的項目里,后面不再單獨討論TurboGears和repoze.bfg了。 Pylons和Django的設(shè)計理念完全不同,Pylons本身只有兩千行左右的Python代碼,不過它還附帶有一些幾乎就是Pylons御用 的第三方模塊。Pylons只提供一個架子和可選方案,你可以根據(jù)自己的喜好自由的選擇Template、ORM、form、auth等組件,系統(tǒng)高度可 定制。我們常說Python是一個膠水語言(glue language),那么我們完全可以說Pylons就是一個用膠水語言設(shè)計的膠水框架。 選擇Pylons多是選擇了它的自由,選擇了自由的同時也預(yù)示著你選擇了噩夢: 學(xué)習(xí)噩夢,Pylons依賴于許多第三方庫,它們并不是Pylons造,你學(xué)Pylons的同時還得學(xué)這些庫怎么使用,關(guān)鍵有些時候你都不知道你 要學(xué)什么。Pylons的學(xué)習(xí)曲線相對比Django要高的多,而之前Pylons的官方文檔也一直是人批評的對象,好在后來出了The Definitive Guide to Pylons這本書,這一局面有所改觀。因為這個原因,Pylons一度被譽為只適合高手使用的Python框架。 調(diào)試噩夢,因為牽涉到的模塊多,一旦有錯誤發(fā)生就比較難定位問題處在哪里??赡苁悄銓懙某绦虻腻e、也可能是Pylons出錯了、再或是SQLAlchemy出錯了、搞不好是formencode有bug,反正很凌亂了。這個只有用的很熟了才能解決這個問題。 升級噩夢,安裝Pylons大大小小共要安裝近20個Python模塊,各有各自的版本號,要升級Pylons的版本,哪個模塊出了不兼容的問題都 有可能,升級基本上很難很難。至今reddit的Pylons還停留在古董的0.9.6上,SQLAlchemy也還是0.5.3的版本,應(yīng)該跟這條有關(guān) 系。 Pylons和repoze.bfg的融合可能會催生下一個能挑戰(zhàn)Django地位的框架。 Tornado即是一個Web server(對此本文不作詳述),同時又是一個類web.py的micro-framework,作為框架Tornado的思想主要來源于 Web.py,大家在Web.py的網(wǎng)站首頁也可以看到Tornado的大佬Bret Taylor的這么一段話(他這里說的FriendFeed用的框架跟Tornado可以看作是一個東西): “[web.py inspired the] Web framework we use at FriendFeed [and] the webapp framework that ships with App Engine…” 因為有這層關(guān)系,后面不再單獨討論Tornado。 Web.py的設(shè)計理念力求精簡(Keep it simple and powerful),總共就沒多少行代碼,也不像Pylons那樣依賴大量的第三方模塊,而是只提供的一個框架所必須的一些東西,如:URL路由、 Template、數(shù)據(jù)庫訪問,其它的就交給用戶自己去做好了。 一個框架精簡的好處在于你可以聚焦在業(yè)務(wù)邏輯上,而不用太多的去關(guān)心框架本身或受框架的干擾,同時缺點也很明顯,許多事情你得自己操刀上。 我個人比較偏好這種精簡的框架,因為你很容易通過閱讀源碼弄明白整個框架的工作機制,如果框架那一塊不是很合意的話,我完全可以Monkey patch一下按自己的要求來。 Bottle和Flask作為新生一代Python框架的代表,挺有意思的是都采用了decorator的方式配置URL路由,如:
from bottle import route, run Bottle、Flask跟web.py一樣,都非常精簡,Bottle甚至所有的代碼都在那一個兩千來行的.py文件里。另外Flask和Pylons一樣,可以跟Jinja2、SQLAlchemy之類結(jié)合的很好。 不過目前不管是Bottle還是Flask成功案例都還很少。 之所以要特別說一下Quixote,是因為國內(nèi)的最大的用Python開發(fā)的網(wǎng)站“豆瓣網(wǎng)”是用Quixote開發(fā)的。我只簡單翻了一下源代碼,沒有做過研究,不發(fā)表評論,有經(jīng)驗的來補充下。我只是在想,如果豆瓣網(wǎng)交到現(xiàn)在來開發(fā),應(yīng)該會有更多的選擇。 其它(web2py、uliweb、Karrigell、Werkzeug …) 最后關(guān)于框架選擇的誤區(qū) 在框架的選擇問題上,許多人很容易就陷入了下面兩個誤區(qū)中而不自知: 1. 哪個框架最好——世上沒有最好的框架,只有最適合你自己、最適合你的團隊的框架。編程語言選擇也是一個道理,你的團隊Python最熟就用Python好 了,如果最熟悉的是Ruby那就用Ruby好了,編程語言、框架都只是工具,能多、快、好、省的干完活就是好東西。 2. 過分關(guān)注性能——其實大部分人是沒必要太關(guān)心框架的性能的,因為你開發(fā)的網(wǎng)站根本就是個小站,能上1萬的IP的網(wǎng)站已經(jīng)不多了,上10萬的更是很少很少。 在沒有一定的訪問量前談性能其實是沒有多大意義的,因為你的CPU和內(nèi)存一直就閑著呢。而且語言和框架一般也不會是性能瓶頸,性能問題最常出現(xiàn)在數(shù)據(jù)庫訪 問和文件讀寫上。 PHP的Zend Framework是出了名的慢,但是Zend Framework一樣有大站,如:digg.com;常被人說有性能問題的Ruby和Rails,不是照樣可以開發(fā)出twitter嗎?再者現(xiàn)在的硬 件、帶寬成本其實是很低的,特別有了云計算平臺后,人力成本才是最貴的,沒有上萬的IP根本就不用太在意性能問題,流量上去了花點錢買點服務(wù)器空間好了, 簡單快速的解決性能問題。 注:前面有網(wǎng)友質(zhì)疑我“Quora是用Pylons開發(fā)的”這樣的說法不客觀,特說明一下,這里所說的某個網(wǎng)站A是用B開發(fā)的,只是指A主要或部分是由B開發(fā)的,大家就不要再去糾結(jié)A還用C了。 |
|