淺談五大Python Web框架

http://www.csdn.net/article/2011-02-17/292058

導讀:作者飛龍寫了一篇《淺談Python Web框架》,文中他介紹了幾個Python Web框架和自己對選擇框架的分析。在他看來,用Django來快速開發一些Web運用是很不錯的選擇。以下是文章內容:

說到Web Framework,Ruby的世界Rails一統江湖,而Python則是一個百花齊放的世界,各種micro-framework、framework不可勝數,不完全列表見:

http://wiki.python.org/moin/WebFrameworks。

雖然另一大腳本語言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。關于模板這一點,一直以來爭論比較多,最近有兩篇關于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會有很大差異。

讓人糾結的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、數據庫訪問,其它的就交給用戶自己去做好了。

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

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

Bottle?&?Flask

Bottle和Flask作為新生一代Python框架的代表,挺有意思的是都采用了decorator的方式配置URL路由,如:

?

[python]?view plaincopy
  1. <span?style="color:?rgb(255,?119,?0);?font-weight:?bold;">from</span>?bottle?<span?style="color:?rgb(255,?119,?0);?font-weight:?bold;">import</span>?route,?run??
  2. ???
  3. @route<span?style="color:?black;">(</span><span?style="color:?rgb(72,?61,?139);">'/:name'</span><span?style="color:?black;">)</span>??
  4. <span?style="color:?rgb(255,?119,?0);?font-weight:?bold;">def</span>?index<span?style="color:?black;">(</span>name=<span?style="color:?rgb(72,?61,?139);">'World'</span><span?style="color:?black;">)</span>:??
  5. ????<span?style="color:?rgb(255,?119,?0);?font-weight:?bold;">return</span>?<span?style="color:?rgb(72,?61,?139);">'&lt;b&gt;Hello?%s!&lt;/b&gt;'</span>?<span?style="color:?rgb(102,?204,?102);">%</span>?name??
  6. ???
  7. run<span?style="color:?black;">(</span>host=<span?style="color:?rgb(72,?61,?139);">'localhost'</span>,?port=<span?style="color:?rgb(255,?69,?0);">8080</span><span?style="color:?black;">)</span>??

Bottle、Flask跟web.py一樣,都非常精簡,Bottle甚至所有的代碼都在那一個兩千來行的.py文件里。另外Flask和Pylons一樣,可以跟Jinja2、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了。

原文鏈接:http://feilong.me/2011/01/talk-about-python-web-framework

轉載于:https://www.cnblogs.com/DjangoBlog/p/3859295.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/248331.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/248331.shtml
英文地址,請注明出處:http://en.pswp.cn/news/248331.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

主流瀏覽器和內核及Web標準

目前網絡市場的瀏覽器主流&#xff1a; 課時3&#xff1a;web標準 WEB標準 w3c 萬維網聯盟組織&#xff0c;制定web標準的機構。 網頁主要由三部分組成&#xff1a; 結構&#xff08;Structure&#xff09;、 表現&#xff08;Presentation&#xff09; 行為&#xff08;Beh…

質量屬性六個常見屬性場景(《淘寶網》為例) 15

六個最常見的系統質量屬性分別是&#xff1a;可用性&#xff08;Availability&#xff09;、可修改性&#xff08;Modifiability&#xff09;、性能&#xff08;Performance&#xff09;、安全性&#xff08;Security&#xff09;、可測試性&#xff08;Testability&#xff09…

機器學習中的損失函數 (著重比較:hinge loss vs softmax loss)

https://blog.csdn.net/u010976453/article/details/78488279 1. 損失函數 損失函數&#xff08;Loss function&#xff09;是用來估量你模型的預測值 f(x)f(x) 與真實值 YY 的不一致程度&#xff0c;它是一個非負實值函數&#xff0c;通常用 L(Y,f(x))L(Y,f(x)) 來表示。損失函…

HTML入門第一和第二章

課時4&#xff1a;HTML初識 1、英文名&#xff08;Hyper Text Markup Language&#xff09;超文本標簽語言 對網頁上的內容進行描述 課時5&#xff1a;HTML骨架 課時6&#xff1a;我的第一個頁面及其標簽簡介 課時7&#xff1a;骨架記憶法 課時8&#xff1a;什么是標簽及其分…

mysql 指令

// 授予用戶某些權限GRANT ALL ON *.* TO USERHOST;// 進入mysql訪問特定數據庫mysql -u user -p database_name// 查看數據表結構DESCRIBE table_name;// 加載文本數據到tableLOAD DATA LOCAL INFILE file_path INTO TABLE table_name;// UPDATE語句UPDATE table_name SET col…

flex label 換行

Flex中label換行有兩種情況 在AS中賦值&#xff1a; label.text"Online\r\nResources" 在mxml中賦值&#xff1a; text"OnlineResources" 在flash builder中就可以換行顯示了。左右有四種對齊方式&#xff0c;上下四種對齊方式。 也就是說mx中的label不支持…

H5第一天

移動Web - 基礎&流式布局 目標 了解移動端主要瀏覽器的內核掌握用谷歌瀏覽器調試移動端頁面&#xff08;重要&#xff09;了解布局視口、視覺視口、理想視口使用mate標簽設置理想視口&#xff08;重要&#xff09;了解視網膜屏、物理像素、二倍圖會使用background-size設…

python數據結構之字典(未完成)

字典 dic {key:value} 1.字典特性 key必須是唯一的&#xff0c;值不必是唯一。 值可以是任何數據類型&#xff0c;比如list&#xff0c;tuple&#xff0c;字符&#xff0c;數值等。key只能是不可變的數據類型。 同一個key不允許重復&#xff0c;如果出現重復&#xff0c;后一個…

一個textView中的文字設置成兩種顏色

使用Spannablestring和ForegroundColorSpan。 SpannableString string2 new SpannableString("自助導入會員和連續開單\n3個月可獲得免費短信服務");ForegroundColorSpan span2 new ForegroundColorSpan(getResources().getColor(R.color.worker_main_worker));str…

boost::timer demo

#include <iostream> #include <boost/timer.hpp> //timer的頭文件 using namespace boost; //打開boost名字空間int main(int argc, char** argv) {timer t; //定義一個計時器對象,并開始計時/*可度量的最大時間,以小時為單位*/std::cout << "max …

H5的第二天

移動web開發——flex布局 目標 了解flex布局的優缺點及原理能夠說出flex布局原理、使用語法、特點&#xff08;重點&#xff09;能夠使用flex布局常用屬性&#xff08;重點&#xff09;能夠獨立完成攜程移動端首頁 1.0 傳統布局和flex布局對比 1.1傳統布局 兼容性好布局繁…

d3.js 入門指南 - 儀表盤

D3的全稱是Data-Driven Documents&#xff08;數據驅動的文檔&#xff09;&#xff0c;是一個用來做數據可視化的JavaScript函數庫&#xff0c;而JavaScript文件的后綴通常為.js&#xff0c;所以D3被稱為D3.js。 d3.js可以定制出各種圖形&#xff0c;今天來用d3.js制作一個簡易…

[轉帖]華為的“大海思”與“小海思”

華為的“大海思”與“小海思” https://www.cnbeta.com/articles/tech/828275.htm沒先到華為海思這么狠.. 作為華為的全資子公司&#xff0c;說起海思半導體&#xff0c;大家可能第一時間會想起麒麟處理器。經過多年的持續的研發投入&#xff0c;華為海思自研的麒麟處理器現在確…

H5第三天(1)

響應式布局 ?核心知識點 less媒體查詢 學習目標 掌握less基本語法能夠使用less編寫css代碼能夠掌握媒體查詢能夠使用媒體查詢實現響應式布局 Less介紹 維護CSS的弊端 CSS本質上不是一門語言,是一個簡單的樣式表.代碼維護相對老套,不夠靈活.LESS介紹 ?LESS預處理器: 依…

CocosPods 引入項目,哪些文件需要上傳到服務器呢?

以上除Podfile外&#xff0c;其它三個文件都不是必須提交的。其中Pods目錄沒必要提交&#xff0c;里面的文件都是根據Podfile描述的依賴庫的配置信息下載和生成的文件。因為CocoaPods支持語義化版本號&#xff0c;所以需要Podfile.lock文件記住當前使用的版本&#xff0c;當然這…

H5第三天(2)

移動web響應式布局 ?知識點-回顧 1. 什么是彈性盒子(伸縮布局) 2. 伸縮布局解決了什么問題 3. 伸縮盒子特點 有一條默認水平顯示的主軸有一條始終要垂直于主軸的側軸 4.重點掌握的屬性 設置伸縮盒子 display: flex;設置主軸對齊方式 justify-content設置側軸對齊方式 a…

X-AdminABP框架開發-系統日志

網站正常運行中有時出現異常在所難免&#xff0c;查看系統運行日志分析問題并能夠根據錯誤信息快速解決問題尤為重要&#xff0c;ABP對于系統運行日志這塊已經做了很好的處理&#xff0c;默認采用的Log4Net已經足夠滿足開發過程中的需要了(當然有需要的話也可以更換為其它日志組…

[Swift]LeetCode826. 安排工作以達到最大收益 | Most Profit Assigning Work

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★?微信公眾號&#xff1a;山青詠芝&#xff08;shanqingyongzhi&#xff09;?博客園地址&#xff1a;山青詠芝&#xff08;https://www.cnblogs.com/strengthen/&#xff09;?GitHub地址&a…

H5第四天(1)

boostrap框架介紹 核心知識點 boostrap框架柵格系統[重點,不是難點]基本的全局樣式 學習目標 能夠使用boostrap框架中的基本樣式能夠使用柵格系統完成阿里百秀案例 boostrap框架 介紹 https://www.bootcss.com/ Bootstrap 是最受歡迎的 HTML、CSS 和 JS 框架&#xff0c;用…

javascript基礎入門知識點整理

學習目標:- 掌握編程的基本思維- 掌握編程的基本語法 typora-copy-images-to: mediaJavaScript基礎 HTML和CSS 京東 課前娛樂 眾人皆笑我瘋癲,我笑爾等看不穿 課前說明 目標&#xff1a;掌握編程的基本思想掌握JavaScript的基礎語法,使用常見API(備注)完成相應案例及練習和作業…