常見的Python Web框架

2021-06-03 11:12:49 字數 4710 閱讀 1236

常見python web框架 **

說到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 inte***ce是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。關於模板這一點,一直以來爭論比較多,最近有兩篇關於python模板的比較有意思的文章可供參考:

需翻牆)

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無異於仙丹,但對有一些人來說它又是毒藥且劇毒。

django案例有disqus.com、bitbucket.org、海報網等。

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一定要結合virtualenv來玩,給自己留條後路,不然會死得很慘。

pylons和repoze.bfg的融合可能會催生下乙個能挑戰django地位的框架。

pylons的案例有reddit.com、dropbox.com、quora.com等。

tornado & web.py

tornado即是乙個web server(對此本文不作詳述),同時又是乙個類web.py的micro-framework,作為框架tornado的思想主要**於web.py,大家在web.py的**首頁也可以看到tornado的大佬bret taylor的這麼一段話(他這裡說的friendfeed用的框架跟tornado可以看作是乙個東西):

因為有這層關係,後面不再單獨討論tornado。

web.py的設計理念力求精簡(keep it ****** and powerful),總共就沒多少行**,也不像pylons那樣依賴大量的第三方模組,而是只提供的乙個框架所必須的一些東西,如:url路由、template、資料庫訪問,其它的就交給使用者自己去做好了。

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

我個人比較偏好這種精簡的框架,因為你很容易通過閱讀原始碼弄明白整個框架的工作機制,如果框架那一塊不是很合意的話,我完全可以monkey patch一下按自己的要求來。

早期的reddit是用web.py寫的,tornado的案例有friendfeed.com、bit.ly、quora.com和我的開源站點poweredsites.org等。

bottle & flask

bottle和flask作為新生一代python框架的代表,挺有意思的是都採用了decorator的方式配置url路由,如:

from bottle import route, run   @route('/:name') def index(name='world'): return 'hello %s!' % name   run(host='localhost', port=8080)

bottle、flask跟web.py一樣,都非常精簡,bottle甚至所有的**都在那乙個兩千來行的.py檔案裡。另外flask和pylons一樣,可以跟jinja2、sqlalchemy之類結合的很好。

不過目前不管是bottle還是flask成功案例都還很少。

quixote

其它(web2py、uliweb、karrigell、werkzeug …)

最後關於框架選擇的誤區

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

哪個框架最好 - 世上沒有最好的框架,只有最適合你自己、最適合你的團隊的框架。程式語言選擇也是乙個道理,你的團隊python最熟就用python好了,如果最熟悉的是ruby那就用ruby好了,程式語言、框架都只是工具,能多、快、好、省的幹完活就是好東西,管***是日本鬼子還是美帝造呢!

過分關注效能 - 其實大部分人是沒必要太關心框架的效能的,因為你開發的**根本就是個小站,能上1萬的ip的**已經不多了,上10萬的更是很少很少。在沒有一定的訪問量前談效能其實是沒有多大意義的,因為你的cpu和記憶體一直就閒著呢。而且語言和框架一般也不會是效能瓶頸,效能問題最常出現在資料庫訪問和檔案讀寫上。php的zend framework是出了名的慢,但是zend framework一樣有大站,如:digg.com;常被人說有效能問題的ruby和rails,不是照樣可以開發出twitter嗎?再者現在的硬體、頻寬成本其實是很低的,特別有了雲計算平台後,人力成本才是最貴的,沒有上萬的ip根本就不用太在意效能問題,流量上去了花點錢買點伺服器空間好了,簡單快速的解決效能問題。

python web開發框架

django python web應用開發框架 django 應該是最出名的python框架,gae甚至erlang都有框架受它影響。django是走大而全的方向,它最出名的是其全自動化的管理後台 只需要使用起orm,做簡單的物件定義,它就能自動生成資料庫結構 以及全功能的管理後台。diesel 基...

python web框架 推薦

flask 很輕,花很少的成本就能夠開發乙個簡單的 非常適合初學者學習。學會以後,可以考慮學習外掛程式的使用,用 sqlalchemy flask sqlalchemy 來對你的資料庫進行控制。django全能型框架 但是不建議初學者學習,因為要學習的東西太多了,一下子難以吸收會失去興趣。當然,dj...

Python Web開發框架

python中的web框架 flask例程 可重用成熟,穩健 可擴充套件性良好 提高開發速度 web框架中的概念 大包大攬的django 優點 完美文件。全套解決方案 cache,session,orm 強大的url路由配置 自助管理後台 缺點 系統緊耦合 自帶的orm不夠強大 template比較...