1. 程式人生 > >淺談Python Web的五大框架

淺談Python Web的五大框架

編程 dex 左右 cpu pytho 在那 一段 Language 缺點

技術分享

說到Web Framework,Ruby的世界Rails一統江湖,而Python則是一個百花齊放的世界。各種micro-framework、framework不可勝數.
盡管還有一大腳本語言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。
· 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無異於仙丹, 但對有一些人來說它又是毒藥且劇毒。
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和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。
Web.py的設計理念力求精簡(Keep it simple and powerful),總共就沒多少行代碼,也不像Pylons那樣依賴大量的第三方模塊,而是僅僅提供的一個框架所必須的一些東西,如:URL路由、 Template、數據庫訪問,其他的就交給用戶自己去做好了。


一個框架精簡的優點在於你能夠聚焦在業務邏輯上,而不用太多的去關心框架本身或受框架的幹擾,同一時候缺點也非常明顯,很多事情你得自己操刀上。
我個人比較偏好這樣的精簡的框架。由於你非常easy通過閱讀源代碼弄明確整個框架的工作機制,假設框架那一塊不是非常合意的話。我全然能夠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一樣,能夠跟Jinja2、SQLAlchemy之類結合的非常好。


只是眼下無論是Bottle還是Flask成功案例都還非常少。
Quixote
之所以要特別說一下Quixote,是由於國內的最大的用Python開發的站點“豆瓣網”是用Quixote開發的。

我僅僅簡單翻了一下源代碼。沒有做過研究,不發表評論,有經驗的來補充下。

我僅僅是在想,假設豆瓣網交到如今來開發。應該會有很多其他的選擇。
其他(web2py、uliweb、Karrigell、Werkzeug …)

最後關於框架選擇的誤區
在框架的選擇問題上,很多人非常easy就陷入了以下兩個誤區中而不自知:

1. 哪個框架最好——世上沒有最好的框架,僅僅有最適合你自己、最適合你的團隊的框架。

編程語言選擇也是一個道理,你的團隊Python最熟就用Python好了。假設最熟悉的是Ruby那就用Ruby好了,編程語言、框架都僅僅是工具,能多、快、好、省的幹完活就是好東西。

2. 過分關註性能——事實上大部分人是不是必需太關心框架的性能的。由於你開發的站點根本就是個小站,能上1萬的IP的站點已經不多了,上10萬的更是非常少非常少。

在沒有一定的訪問量前談性能事實上是沒有多大意義的,由於你的CPU和內存一直就閑著呢。

並且語言和框架一般也不會是性能瓶頸,性能問題最常出如今數據庫訪問和文件讀寫上。 PHP的Zend Framework是出了名的慢,但是Zend Framework一樣有大站,如:digg.com;常被人說有性能問題的Ruby和Rails,不是照樣能夠開發出twitter嗎?再者如今的硬 件、帶寬成本事實上是非常低的,特別有了雲計算平臺後,人力成本才是最貴的,沒有上萬的IP根本就不用太在意性能問題,流量上去了花點錢買點服務器空間好了。 簡單高速的解決性能問題。

淺談Python Web的五大框架