两个Python web框架:Django Tornado比较
我已經(jīng)混亂了, Tornado是 Nginx、Django、Node.js 的結(jié)合體?又或是 Nginx * 20% + Django * 40% + Node.js * 40% ?
你需要搞清楚幾個(gè)概念:
1,web server是監(jiān)聽端口,負(fù)責(zé)HTTP鏈接管理、數(shù)據(jù)收發(fā)、HTTP協(xié)議實(shí)現(xiàn)等底層上的處理。
2,Web框架定義的是單個(gè)HTTP請求處理的流程。
3,nginx是反向代理服務(wù)器,是一個(gè)特殊的web server應(yīng)用,和web server并不是同級的概念。
Tornado既是web server又是web框架,這兩者并不矛盾。
舉例來說,你寫了一個(gè)tornado應(yīng)用之后,直接把tornado端口跑在8000,這個(gè)時(shí)候,通過localhost:8000/foo就能訪問到你的網(wǎng)頁。這里分兩步,tornado完成了底部IO事件的監(jiān)聽和數(shù)據(jù)接受等工作,這是tornado完成了其作為web server的使命。然后你通過按照tornado框架定義的流程,在對應(yīng)的地方寫了個(gè)get函數(shù),實(shí)現(xiàn)了這個(gè)頁面的具體內(nèi)容,這是tornado作為web 框架體現(xiàn)了作用。
那么nginx有什么用?
他是個(gè)反向代理,反向代理顧名思義,其作用就是將接收到的HTTP請求按照一定的規(guī)則轉(zhuǎn)發(fā)給后端其他服務(wù)器處理。
比如在你的一臺(tái)機(jī)器上跑了三個(gè)tornado應(yīng)用:foo1,foo2,foo3,端口分別為8000,8001,8003,你希望用戶可以直接通過80端口來訪問這些應(yīng)用。這個(gè)時(shí)候你就可以用nginx來達(dá)到這個(gè)目的了。讓nginx跑在80端口,當(dāng)他接收到請求時(shí),如果是/foo1,就轉(zhuǎn)發(fā)給8000端口處理;如果是/foo2,就轉(zhuǎn)發(fā)給8001端口處理,foo3類似。
所以,tornado和nginx并沒有什么聯(lián)系。實(shí)際上,很多框架都實(shí)現(xiàn)了一些簡易web server,用于調(diào)試。tornado的web server是異步的,以可以處理大量的非活躍長連接著稱。所以其web server是他的一個(gè)特性feature,在介紹的時(shí)候就會(huì)提及自己是一個(gè)很酷的webserver了。
回到主題,題主你在你機(jī)器上裝裝nginx、用tornado寫個(gè)hello world就都清楚了。 ==============================================================================================
Django
?
Django 應(yīng)該是最出名的py框架,Google App Engine甚至Erlang都有框架受它影響。
?
Django是走大而全的方向,它最出名的是其全自動(dòng)化的管理后臺(tái):只需要使用起ORM,做簡單的對象定義,它就能自動(dòng)生成數(shù)據(jù)庫結(jié)構(gòu)、以及全功能的管理后臺(tái)。
?
Django提供的方便,也意味著Django內(nèi)置的ORM跟框架內(nèi)的其他模塊耦合程度高。
?
應(yīng)用程序必須使用Django內(nèi)置的ORM,否則就不能享受到框架內(nèi)提供的種種基于其ORM的便利;理論上可以切換掉其ORM模塊,但這就相當(dāng)于要把裝修完畢的房子拆除重新裝修,倒不如一開始就去毛胚房做全新的裝修。
?
Django的賣點(diǎn)是超高的開發(fā)效率,其性能擴(kuò)展有限;采用Django的項(xiàng)目,在流量達(dá)到一定規(guī)模后,都需要對其進(jìn)行重構(gòu),才能滿足性能的要求。
?
這方面的經(jīng)驗(yàn)可以參考:http://www.slideshare.net/zeeg/djangocon-2010-scaling-disqus
?
Ruby的Rails也有類似的問題;以Twitter為例,推特到了今日的規(guī)模,不要說Rails,甚至是連Ruby都需要拋棄重來。
?
就我的感覺Django適用的是中小型的網(wǎng)站,或者是作為大型網(wǎng)站快速實(shí)現(xiàn)產(chǎ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)影響最大、爭議最大的部分。
?
Django模板的設(shè)計(jì)哲學(xué)是徹底的將代碼、樣式分離;asp.net提倡將代碼/模板分離,但技術(shù)上還是可以混合;而Django則是從根本上杜絕在模板中進(jìn)行編碼、處理數(shù)據(jù)的可能。
?
比方說,asp.net模板中可以寫:
<%
?int i;
?for(i==0;i<10;i++){
?....
?}
%>
?
Django是徹底不支持嵌入類似上面的代碼,僅能使用其模板內(nèi)置的函數(shù);這實(shí)際上,是為其模板構(gòu)造了一種“新語言”;由于此“新語言”十分簡單,所以也能夠?qū)⑵淠0逡浦驳讲煌脚_(tái)。
?
大多數(shù)情況下,Django的模板功能是足夠的,但對于特殊(有時(shí)“特殊”也不是十分特殊)的情況,還是需要在模板中嵌入代碼,那么就需要根據(jù)其模板系統(tǒng)的規(guī)則做模板擴(kuò)展。有時(shí)候,模板中直接寫一行代碼能夠解決的問題,用模板擴(kuò)展實(shí)現(xiàn)后,會(huì)變成十幾行代碼。
?
是否容忍在模板中編程,正是Django模板爭議最大之處。
?
Tornado
?
Tornado( http://www.tornadoweb.org )是Facebook開源出來的框架,其哲學(xué)跟Django近乎兩個(gè)極端。
?
Tornado走的是少而精的方向,它也有提供模板功能;雖然不鼓勵(lì),但作者是可以允許在模板進(jìn)行少量編碼(直接嵌入單行py代碼)的。
?
如果跟asp.net相比,Tornado有點(diǎn)類似僅實(shí)現(xiàn)了AsyncHttpHandler;除此之外,全部需要自己去實(shí)現(xiàn)。
?
好吧,其實(shí)它有模板,有國際化支持,甚至還有內(nèi)置的OAuth/OpenID模塊,方便做第三方登錄,它其實(shí)也直接實(shí)現(xiàn)了Http服務(wù)器。
?
但它沒有ORM(僅有一個(gè)mysql的超簡單封裝),甚至沒有Session支持,更不要說Django那樣自動(dòng)化的后臺(tái)。
?
假設(shè)是一個(gè)大型網(wǎng)站,在高性能的要求下,框架的各個(gè)部分往往都需要定制,可以復(fù)用的模塊非常少;一個(gè)以Django開發(fā)的網(wǎng)站,各部分經(jīng)過不斷的定制,Django框架剩下的,很有可能也就是tornado一開始所能提供的這部分。
?
殊途同歸。
?
===== HTTP服務(wù)器 =====
Tornado為了高效實(shí)現(xiàn)Comet/后端異步調(diào)用HTTP接口,是直接內(nèi)嵌了HTTP服務(wù)器。
?
前端無需加apache / lighttpd / nginx等也可以供瀏覽器訪問;但它并沒有完整實(shí)現(xiàn)HTTP 1.1的協(xié)議,所以官方文檔是推薦用戶在生產(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)勢。
?
===== 單線程異步 =====
網(wǎng)站基本都會(huì)有數(shù)據(jù)庫操作,而Tornado是單線程的,這意味著如果數(shù)據(jù)庫查詢返回過慢,整個(gè)服務(wù)器響應(yīng)會(huì)被堵塞。
?
數(shù)據(jù)庫查詢,實(shí)質(zhì)上也是遠(yuǎn)程的網(wǎng)絡(luò)調(diào)用;理想情況下,是將這些操作也封裝成為異步的;但Tornado對此并**沒有**提供任何支持。
?
這是Tornado的**設(shè)計(jì)**,而不是缺陷。
?
一個(gè)系統(tǒng),要滿足高流量;是必須解決數(shù)據(jù)庫查詢速度問題的!
?
數(shù)據(jù)庫若存在查詢性能問題,整個(gè)系統(tǒng)無論如何優(yōu)化,數(shù)據(jù)庫都會(huì)是瓶頸,拖慢整個(gè)系統(tǒng)!
?
異步并**不能**從本質(zhì)上提到系統(tǒng)的性能;它僅僅是避免多余的網(wǎng)絡(luò)響應(yīng)等待,以及切換線程的CPU耗費(fèi)。
?
如果數(shù)據(jù)庫查詢響應(yīng)太慢,需要解決的是數(shù)據(jù)庫的性能問題;而不是調(diào)用數(shù)據(jù)庫的前端Web應(yīng)用。
?
對于實(shí)時(shí)返回的數(shù)據(jù)查詢,理想情況下需要確保所有數(shù)據(jù)都在內(nèi)存中,數(shù)據(jù)庫硬盤IO應(yīng)該為0;這樣的查詢才能足夠快;而如果數(shù)據(jù)庫查詢足夠快,那么前端web應(yīng)用也就無將數(shù)據(jù)查詢封裝為異步的必要。
?
就算是使用協(xié)程,異步程序?qū)τ谕匠绦蚴冀K還是會(huì)提高復(fù)雜性;需要衡量的是處理這些額外復(fù)雜性是否值得。
?
如果后端有查詢實(shí)在是太慢,無法繞過,Tornaod的建議是將這些查詢在后端封裝獨(dú)立封裝成為HTTP接口,然后使用Tornado內(nèi)置的異步HTTP客戶端進(jìn)行調(diào)用。
轉(zhuǎn)載于:https://www.cnblogs.com/duanxz/p/5428525.html
總結(jié)
以上是生活随笔為你收集整理的两个Python web框架:Django Tornado比较的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 平安由你信用卡额度是多少?额度提升快吗?
- 下一篇: 中信途牛visa信用卡权益 境外旅游必备