在各種語(yǔ)言平臺(tái)中侵俗,python涌現(xiàn)的web框架恐怕是最多的痛倚;猜想原因應(yīng)該是在py中構(gòu)造框架十分簡(jiǎn)單,使得輪子不斷被發(fā)明臊诊。
這里記述一下我了解過(guò)的兩個(gè)py web框架鸽粉,供大家參考,希望能起他山之石的作用抓艳。
Django
Django 應(yīng)該是最出名的py框架触机,Google App Engine甚至Erlang都有框架受它影響。
Django是走大而全的方向玷或,它最出名的是其全自動(dòng)化的管理后臺(tái):只需要使用起ORM儡首,做簡(jiǎn)單的對(duì)象定義,它就能自動(dòng)生成數(shù)據(jù)庫(kù)結(jié)構(gòu)偏友、以及全功能的管理后臺(tái)蔬胯。
Django提供的方便,也意味著Django內(nèi)置的ORM跟框架內(nèi)的其他模塊耦合程度高位他。
應(yīng)用程序必須使用Django內(nèi)置的ORM氛濒,否則就不能享受到框架內(nèi)提供的種種基于其ORM的便利;理論上可以切換掉其ORM模塊鹅髓,但這就相當(dāng)于要把裝修完畢的房子拆除重新裝修舞竿,倒不如一開(kāi)始就去毛胚房做全新的裝修奠骄。
Django的賣(mài)點(diǎn)是超高的開(kāi)發(fā)效率聋庵,其性能擴(kuò)展有限规哲;采用Django的項(xiàng)目渗柿,在流量達(dá)到一定規(guī)模后,都需要對(duì)其進(jìn)行重構(gòu)帖鸦,才能滿足性能的要求家厌。
這方面的經(jīng)驗(yàn)可以參考:http://www.slideshare.net/zeeg/djangocon-2010-scaling-disqus
Ruby的Rails也有類(lèi)似的問(wèn)題先巴;以Twitter為例芜赌,推特到了今日的規(guī)模仰挣,不要說(shuō)Rails,甚至是連Ruby都需要拋棄重來(lái)缠沈。
就我的感覺(jué)Django適用的是中小型的網(wǎng)站椎木,或者是作為大型網(wǎng)站快速實(shí)現(xiàn)產(chǎn)品雛形的工具违柏。
學(xué)習(xí)Python中的小伙伴,需要學(xué)習(xí)資料的話香椎,可以前往我的微信公眾號(hào):速學(xué)Python,后臺(tái)回復(fù):簡(jiǎn)書(shū)禽篱,即可拿Python學(xué)習(xí)資料
這里有我自己整理了一套最新的python系統(tǒng)學(xué)習(xí)教程畜伐,包括從基礎(chǔ)的python腳本到web開(kāi)發(fā)、爬蟲(chóng)躺率、數(shù)據(jù)分析玛界、數(shù)據(jù)可視化、機(jī)器學(xué)習(xí)等悼吱。送給正在學(xué)習(xí)python的小伙伴慎框!這里是python學(xué)習(xí)者聚集地,歡迎初學(xué)和進(jìn)階中的小伙伴后添!
快速推出產(chǎn)品是王道:
?Believe it or not, the bigger problem isn't scaling, it's getting to the point where you have to scale. Without the first problem you won't have the second. - http://gettingreal.37signals.com/ch04_Scale_Later.php
===== Django 模板 =====
Django的模板系統(tǒng)設(shè)計(jì)十分有意思笨枯,也應(yīng)該其框架內(nèi)影響最大、爭(zhēng)議最大的部分遇西。
Django模板的設(shè)計(jì)哲學(xué)是徹底的將代碼馅精、樣式分離;asp.net提倡將代碼/模板分離粱檀,但技術(shù)上還是可以混合洲敢;而Django則是從根本上杜絕在模板中進(jìn)行編碼、處理數(shù)據(jù)的可能茄蚯。
比方說(shuō)压彭,asp.net模板中可以寫(xiě):
<%
?int i;
?for(i==0;i<10;i++){
?....
?}
%>
Django是徹底不支持嵌入類(lèi)似上面的代碼,僅能使用其模板內(nèi)置的函數(shù)渗常;這實(shí)際上壮不,是為其模板構(gòu)造了一種“新語(yǔ)言”;由于此“新語(yǔ)言”十分簡(jiǎn)單凳谦,所以也能夠?qū)⑵淠0逡浦驳讲煌脚_(tái)忆畅。
大多數(shù)情況下,Django的模板功能是足夠的尸执,但對(duì)于特殊(有時(shí)“特殊”也不是十分特殊)的情況家凯,還是需要在模板中嵌入代碼,那么就需要根據(jù)其模板系統(tǒng)的規(guī)則做模板擴(kuò)展如失。有時(shí)候绊诲,模板中直接寫(xiě)一行代碼能夠解決的問(wèn)題,用模板擴(kuò)展實(shí)現(xiàn)后褪贵,會(huì)變成十幾行代碼掂之。
是否容忍在模板中編程抗俄,正是Django模板爭(zhēng)議最大之處。
Tornado
Tornado( http://www.tornadoweb.org )是Facebook開(kāi)源出來(lái)的框架世舰,其哲學(xué)跟Django近乎兩個(gè)極端动雹。
Tornado走的是少而精的方向,它也有提供模板功能跟压;雖然不鼓勵(lì)胰蝠,但作者是可以允許在模板進(jìn)行少量編碼(直接嵌入單行py代碼)的。
如果跟asp.net相比震蒋,Tornado有點(diǎn)類(lèi)似僅實(shí)現(xiàn)了AsyncHttpHandler茸塞;除此之外,全部需要自己去實(shí)現(xiàn)查剖。
好吧钾虐,其實(shí)它有模板,有國(guó)際化支持笋庄,甚至還有內(nèi)置的OAuth/OpenID模塊效扫,方便做第三方登錄,它其實(shí)也直接實(shí)現(xiàn)了Http服務(wù)器无切。
但它沒(méi)有ORM(僅有一個(gè)mysql的超簡(jiǎn)單封裝)荡短,甚至沒(méi)有Session支持,更不要說(shuō)Django那樣自動(dòng)化的后臺(tái)哆键。
假設(shè)是一個(gè)大型網(wǎng)站掘托,在高性能的要求下,框架的各個(gè)部分往往都需要定制籍嘹,可以復(fù)用的模塊非常少闪盔;一個(gè)以Django開(kāi)發(fā)的網(wǎng)站,各部分經(jīng)過(guò)不斷的定制辱士,Django框架剩下的泪掀,很有可能也就是tornado一開(kāi)始所能提供的這部分。
殊途同歸颂碘。
===== HTTP服務(wù)器 =====
Tornado為了高效實(shí)現(xiàn)Comet/后端異步調(diào)用HTTP接口异赫,是直接內(nèi)嵌了HTTP服務(wù)器。
前端無(wú)需加apache / lighttpd / nginx等也可以供瀏覽器訪問(wèn)头岔;但它并沒(méi)有完整實(shí)現(xiàn)HTTP 1.1的協(xié)議塔拳,所以官方文檔是推薦用戶(hù)在生產(chǎn)環(huán)境下在前端使用nginx,后端反向代理到多個(gè)Tornado實(shí)例峡竣。
Tornado本身是單線程的異步網(wǎng)絡(luò)程序靠抑,它默認(rèn)啟動(dòng)時(shí),會(huì)根據(jù)CPU數(shù)量運(yùn)行多個(gè)實(shí)例适掰;充分利用CPU多核的優(yōu)勢(shì)颂碧。
===== 單線程異步 =====
網(wǎng)站基本都會(huì)有數(shù)據(jù)庫(kù)操作荠列,而Tornado是單線程的,這意味著如果數(shù)據(jù)庫(kù)查詢(xún)返回過(guò)慢载城,整個(gè)服務(wù)器響應(yīng)會(huì)被堵塞肌似。
數(shù)據(jù)庫(kù)查詢(xún),實(shí)質(zhì)上也是遠(yuǎn)程的網(wǎng)絡(luò)調(diào)用诉瓦;理想情況下锈嫩,是將這些操作也封裝成為異步的;但Tornado對(duì)此并**沒(méi)有**提供任何支持垦搬。
這是Tornado的**設(shè)計(jì)**,而不是缺陷艳汽。
一個(gè)系統(tǒng)猴贰,要滿足高流量;是必須解決數(shù)據(jù)庫(kù)查詢(xún)速度問(wèn)題的河狐!
數(shù)據(jù)庫(kù)若存在查詢(xún)性能問(wèn)題米绕,整個(gè)系統(tǒng)無(wú)論如何優(yōu)化,數(shù)據(jù)庫(kù)都會(huì)是瓶頸馋艺,拖慢整個(gè)系統(tǒng)栅干!
異步并**不能**從本質(zhì)上提到系統(tǒng)的性能;它僅僅是避免多余的網(wǎng)絡(luò)響應(yīng)等待捐祠,以及切換線程的CPU耗費(fèi)碱鳞。
如果數(shù)據(jù)庫(kù)查詢(xún)響應(yīng)太慢,需要解決的是數(shù)據(jù)庫(kù)的性能問(wèn)題踱蛀;而不是調(diào)用數(shù)據(jù)庫(kù)的前端Web應(yīng)用窿给。
對(duì)于實(shí)時(shí)返回的數(shù)據(jù)查詢(xún),理想情況下需要確保所有數(shù)據(jù)都在內(nèi)存中率拒,數(shù)據(jù)庫(kù)硬盤(pán)IO應(yīng)該為0崩泡;這樣的查詢(xún)才能足夠快;而如果數(shù)據(jù)庫(kù)查詢(xún)足夠快猬膨,那么前端web應(yīng)用也就無(wú)將數(shù)據(jù)查詢(xún)封裝為異步的必要角撞。
就算是使用協(xié)程,異步程序?qū)τ谕匠绦蚴冀K還是會(huì)提高復(fù)雜性勃痴;需要衡量的是處理這些額外復(fù)雜性是否值得谒所。
如果后端有查詢(xún)實(shí)在是太慢,無(wú)法繞過(guò)召耘,Tornaod的建議是將這些查詢(xún)?cè)诤蠖朔庋b獨(dú)立封裝成為HTTP接口百炬,然后使用Tornado內(nèi)置的異步HTTP客戶(hù)端進(jìn)行調(diào)用。