您當前位置>首頁 » 新聞資(zī)訊 » 網站(zhàn)建設 >
淺談五大Python Web框架
發表時間:2019-3-5
發布人:葵宇科技
浏覽次數:27
轉載:http://feilong.me/2011/01/talk-about-Python-web-framework
說到Web Framework,Ruby的世界Rails一統江湖,而Python則是一個(gè)百花(huā)齊放的世界,各種micro-framework、framework不可(kě)勝數,不完全列表見:
http://wiki.python.org/moin/WebFrameworks
雖然另一大腳本語言PHP也有不少(shǎo)框架,但遠(yuǎn)沒有Python這麼誇張,也正是因為Python Web Framework(Python Web開發框架,以下(xià)簡稱Python框架)太多,所以在Python社區總有關(guān)于Python框架孰優孰劣的話題,讨論的時間跨度甚至長達3-5年。
Python這麼多框架,能挨個(gè)玩個(gè)遍的人不多,坦白的說我也隻用過其中(zhōng)的三個(gè)開發過項目,另外一些稍微接觸過,所以這裡隻能淺談一下(xià),歡迎懂行的朋友們補充。
Django
Python框架雖然說是百花(huā)齊放,但仍然有那麼一家是最大的,它就是Django。要說Django是Python框架裡最好的,有人同意也有人 堅決反對,但說Django的文(wén)檔最完善、市場占有率最高、招聘職位最多估計大家都沒什麼意見。Django為人所稱道的地方主要有:
完美的文(wén)檔,Django的成功,我覺得很大一部分原因要歸功于Django近乎完美的官方文(wén)檔(包括Django book)。
全套的解決方案,Django象Rails一樣,提供全套的解決方案(full-stack framework + batteries included),基本要什麼有什麼(比如(rú):cache、session、feed、orm、geo、auth),而且全部Django自己造,開發網 站(zhàn)應手的工具Django基本都給你(nǐ)做好了,因此開發效率是不用說的,出了問(wèn)題也算好找,不在你(nǐ)的代碼裡就在Django的源碼裡。
強大的URL路(lù)由配置,Django讓你(nǐ)可(kě)以設計出非常優雅的URL,在Django裡你(nǐ)基本可(kě)以跟醜陋的GET參數說拜拜。
自助管理後台,admin interface是Django裡比較吸引眼球的一項contrib,讓你(nǐ)幾乎不用寫一行代碼就擁有一個(gè)完整的後台管理界面。
系統緊耦合,如(rú)果你(nǐ)覺得Django内置的某項功能不是很好,想用喜歡的第三方庫來代替是很難的,比如(rú)下(xià)面将要說的ORM、Template。要在Django裡用SQLAlchemy或Mako幾乎是不可(kě)能,即使打了一些補丁用上了也會讓你(nǐ)覺得非常非常别扭。
Template功能比較弱,不能插入Python代碼,要寫複雜一點的邏輯需要另外用Python實現Tag或Filter。關(guān)于模闆這一點,一直以來争論比較多,最近有兩篇關(guān)于Python模闆的比較有意思的文(wén)章可(kě)供參考:
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的理念完全相左,高手和(hé)初識Django的人配出來的URL會有很大差異。
數據庫schema都給你(nǐ)定好了,這樣問(wèn)題就來了,比如(rú)很多網站(zhàn)要求email地址唯一,可(kě)schema裡這個(gè)字段的值不是唯一的,糾結是必須的了。
總的來說,Django大包大攬,用它來快速開發一些Web運用是很不錯的。如(rú)果你(nǐ)順着Django的設計哲學來,你(nǐ)會覺得Django很好用,越用越順手;相反,你(nǐ)如(rú)果不能融入或接受Django的設計哲學,你(nǐ)用Django一定會很痛苦,趁早放棄的好。所以說在有些人眼裡Django無異于仙丹, 但對有一些人來說它又是毒藥且劇毒。
Pylons & TurboGears & repoze.bfg
除了Django另一個(gè)大頭就是Pylons了,因為TurboGears2.x是基于Pylons來做的,而repoze.bfg也已經并入Pylons project裡這個(gè)大的項目裡,後面不再單獨讨論TurboGears和(hé)repoze.bfg了。
Pylons和(hé)Django的設計理念完全不同,Pylons本身隻有兩千行左右的Python代碼,不過它還附帶有一些幾乎就是Pylons禦用 的第三方模塊。Pylons隻提供一個(gè)架子(zǐ)和(hé)可(kě)選方案,你(nǐ)可(kě)以根據自己的喜好自由的選擇Template、ORM、form、auth等組件,系統高度可(kě) 定制。我們常說Python是一個(gè)膠水語言(glue language),那麼我們完全可(kě)以說Pylons就是一個(gè)用膠水語言設計的膠水框架。
選擇Pylons多是選擇了它的自由,選擇了自由的同時也預示着你(nǐ)選擇了噩夢:
學習噩夢,Pylons依賴于許多第三方庫,它們并不是Pylons造,你(nǐ)學Pylons的同時還得學這些庫怎麼使用,關(guān)鍵有些時候你(nǐ)都不知道你(nǐ) 要學什麼。Pylons的學習曲線相對比Django要高的多,而之前Pylons的官方文(wén)檔也一直是人批評的對象,好在後來出了The Definitive Guide to Pylons這本書,這一局面有所改觀。因為這個(gè)原因,Pylons一度被譽為隻适合高手使用的Python框架。
調試噩夢,因為牽涉到的模塊多,一旦有錯誤發生就比較難定位問(wèn)題處在哪裡。可(kě)能是你(nǐ)寫的程序的錯、也可(kě)能是Pylons出錯了、再或是SQLAlchemy出錯了、搞不好是formencode有bug,反正很淩亂了。這個(gè)隻有用的很熟了才能解決這個(gè)問(wèn)題。
Pylons和(hé)repoze.bfg的融合可(kě)能會催生下(xià)一個(gè)能挑戰Django地位的框架。
Tornado & web.py
Tornado即是一個(gè)Web server(對此本文(wén)不作詳述),同時又是一個(gè)類web.py的micro-framework,作為框架Tornado的思想主要來源于Web.py,大家在Web.py的網站(zhàn)首頁也可(kě)以看到Tornado的大佬Bret Taylor的這麼一段話(他這裡說的FriendFeed用的框架跟Tornado可(kě)以看作是一個(gè)東西):
“[web.py inspired the] Web framework we use at FriendFeed [and] the webapp framework that ships with App Engine…”
因為有這層關(guān)系,後面不再單獨讨論Tornado。
一個(gè)框架精簡的好處在于你(nǐ)可(kě)以聚焦在業(yè)務邏輯上,而不用太多的去關(guān)心框架本身或受框架的幹擾,同時缺點也很明顯,許多事情你(nǐ)得自己操刀上。
我個(gè)人比較偏好這種精簡的框架,因為你(nǐ)很容易通(tōng)過閱讀源碼弄明白整個(gè)框架的工作機制,如(rú)果框架那一塊不是很合意的話,我完全可(kě)以Monkey patch一下(xià)按自己的要求來。
Bottle & Flask
Bottle和(hé)Flask作為新生一代Python框架的代表,挺有意思的是都采用了decorator的方式配置URL路(lù)由,如(rú):
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甚至所有的代碼都在那一個(gè)兩千來行的.py文(wén)件裡。另外Flask和(hé)Pylons一樣,可(kě)以跟Jinja2、SQLAlchemy之類結合的很好。
不過目前不管是Bottle還是Flask成功案例都還很少(shǎo)。
Quixote
之所以要特别說一下(xià)Quixote,是因為國内的最大的用Python開發的網站(zhàn)“豆瓣網”是用Quixote開發的。我隻簡單翻了一下(xià)源代碼,沒有做過研究,不發表評論,有經驗的來補充下(xià)。我隻是在想,如(rú)果豆瓣網交到現在來開發,應該會有更多的選擇。
其它(web2py、uliweb、Karrigell、Werkzeug …)
最後關(guān)于框架選擇的誤區
在框架的選擇問(wèn)題上,許多人很容易就陷入了下(xià)面兩個(gè)誤區中(zhōng)而不自知:
1. 哪個(gè)框架最好——世上沒有最好的框架,隻有最适合你(nǐ)自己、最适合你(nǐ)的團隊的框架。編程語言選擇也是一個(gè)道理,你(nǐ)的團隊Python最熟就用Python好了,如(rú)果最熟悉的是Ruby那就用Ruby好了,編程語言、框架都隻是工具,能多、快、好、省的幹完活就是好東西。
2. 過分關(guān)注性能——其實大部分人是沒必要太關(guān)心框架的性能的,因為你(nǐ)開發的網站(zhàn)根本就是個(gè)小站(zhàn),能上1萬的IP的網站(zhàn)已經不多了,上10萬的更是很少(shǎo)很少(shǎo)。在沒有一定的訪問(wèn)量前談性能其實是沒有多大意義的,因為你(nǐ)的CPU和(hé)内存一直就閑着呢(ne)。而且語言和(hé)框架一般也不會是性能瓶頸,性能問(wèn)題最常出現在數據庫訪問(wèn)和(hé)文(wén)件讀寫上。 PHP的Zend Framework是出了名的慢,但是Zend Framework一樣有大站(zhàn),如(rú):digg.com;常被人說有性能問(wèn)題的Ruby和(hé)Rails,不是照樣可(kě)以開發出twitter嗎?再者現在的硬 件、帶寬成本其實是很低的,特别有了雲計算平台後,人力成本才是最貴的,沒有上萬的IP根本就不用太在意性能問(wèn)題,流量上去了花(huā)點錢買點服務器(qì)空間好了, 簡單快速的解決性能問(wèn)題。
注:前面有網友質疑我“Quora是用Pylons開發的”這樣的說法不客觀,特說明一下(xià),這裡所說的某個(gè)網站(zhàn)A是用B開發的,隻是指A主要或部分是由B開發的,大家就不要再去糾結A還用C了。