兩個Python web框架:Django Tornado比較

就是說它作為 web 框架比 Django 簡單,又支援異步 IO,且更不需要前端的 webserver ?
我已經混亂了, Tornado是 Nginx、Django、Node.js 的結合體?又或是 Nginx * 20% + Django * 40% + Node.js * 40% ?


你需要搞清楚幾個概念:
1,web server是監聽端口,負責HTTP鏈接管理、數據收發、HTTP協議實現等底層上的處理。
2,Web框架定義的是單個HTTP請求處理的流程。
3,nginx是反向代理服務器,是一個特殊的web server應用,和web server并不是同級的概念。

Tornado既是web server又是web框架,這兩者并不矛盾。

舉例來說,你寫了一個tornado應用之后,直接把tornado端口跑在8000,這個時候,通過localhost:8000/foo就能訪問到你的網頁。這里分兩步,tornado完成了底部IO事件的監聽和數據接受等工作,這是tornado完成了其作為web server的使命。然后你通過按照tornado框架定義的流程,在對應的地方寫了個get函數,實現了這個頁面的具體內容,這是tornado作為web 框架體現了作用。

那么nginx有什么用?

他是個反向代理,反向代理顧名思義,其作用就是將接收到的HTTP請求按照一定的規則轉發給后端其他服務器處理。

比如在你的一臺機器上跑了三個tornado應用:foo1,foo2,foo3,端口分別為8000,8001,8003,你希望用戶可以直接通過80端口來訪問這些應用。這個時候你就可以用nginx來達到這個目的了。讓nginx跑在80端口,當他接收到請求時,如果是/foo1,就轉發給8000端口處理;如果是/foo2,就轉發給8001端口處理,foo3類似。


所以,tornado和nginx并沒有什么聯系。實際上,很多框架都實現了一些簡易web server,用于調試。tornado的web server是異步的,以可以處理大量的非活躍長連接著稱。所以其web server是他的一個特性feature,在介紹的時候就會提及自己是一個很酷的webserver了。

回到主題,題主你在你機器上裝裝nginx、用tornado寫個hello world就都清楚了。
==============================================================================================

Django

?

Django 應該是最出名的py框架,Google App Engine甚至Erlang都有框架受它影響。

?

Django是走大而全的方向,它最出名的是其全自動化的管理后臺:只需要使用起ORM,做簡單的對象定義,它就能自動生成數據庫結構、以及全功能的管理后臺。

?

Django提供的方便,也意味著Django內置的ORM跟框架內的其他模塊耦合程度高。

?

應用程序必須使用Django內置的ORM,否則就不能享受到框架內提供的種種基于其ORM的便利;理論上可以切換掉其ORM模塊,但這就相當于要把裝修完畢的房子拆除重新裝修,倒不如一開始就去毛胚房做全新的裝修。

?

Django的賣點是超高的開發效率,其性能擴展有限;采用Django的項目,在流量達到一定規模后,都需要對其進行重構,才能滿足性能的要求。

?

這方面的經驗可以參考:http://www.slideshare.net/zeeg/djangocon-2010-scaling-disqus

?

Ruby的Rails也有類似的問題;以Twitter為例,推特到了今日的規模,不要說Rails,甚至是連Ruby都需要拋棄重來。

?

就我的感覺Django適用的是中小型的網站,或者是作為大型網站快速實現產品雛形的工具。

?

快速推出產品是王道:

?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的模板系統設計十分有意思,也應該其框架內影響最大、爭議最大的部分。

?

Django模板的設計哲學是徹底的將代碼、樣式分離;asp.net提倡將代碼/模板分離,但技術上還是可以混合;而Django則是從根本上杜絕在模板中進行編碼、處理數據的可能。

?

比方說,asp.net模板中可以寫:

<%

?int i;

?for(i==0;i<10;i++){

?....

?}

%>

?

Django是徹底不支持嵌入類似上面的代碼,僅能使用其模板內置的函數;這實際上,是為其模板構造了一種“新語言”;由于此“新語言”十分簡單,所以也能夠將其模板移植到不同平臺。

?

大多數情況下,Django的模板功能是足夠的,但對于特殊(有時“特殊”也不是十分特殊)的情況,還是需要在模板中嵌入代碼,那么就需要根據其模板系統的規則做模板擴展。有時候,模板中直接寫一行代碼能夠解決的問題,用模板擴展實現后,會變成十幾行代碼。

?

是否容忍在模板中編程,正是Django模板爭議最大之處。

?

Tornado

?

Tornado( http://www.tornadoweb.org )是Facebook開源出來的框架,其哲學跟Django近乎兩個極端。

?

Tornado走的是少而精的方向,它也有提供模板功能;雖然不鼓勵,但作者是可以允許在模板進行少量編碼(直接嵌入單行py代碼)的。

?

如果跟asp.net相比,Tornado有點類似僅實現了AsyncHttpHandler;除此之外,全部需要自己去實現。

?

好吧,其實它有模板,有國際化支持,甚至還有內置的OAuth/OpenID模塊,方便做第三方登錄,它其實也直接實現了Http服務器。

?

但它沒有ORM(僅有一個mysql的超簡單封裝),甚至沒有Session支持,更不要說Django那樣自動化的后臺。

?

假設是一個大型網站,在高性能的要求下,框架的各個部分往往都需要定制,可以復用的模塊非常少;一個以Django開發的網站,各部分經過不斷的定制,Django框架剩下的,很有可能也就是tornado一開始所能提供的這部分。

?

殊途同歸。

?

===== HTTP服務器 =====

Tornado為了高效實現Comet/后端異步調用HTTP接口,是直接內嵌了HTTP服務器。

?

前端無需加apache / lighttpd / nginx等也可以供瀏覽器訪問;但它并沒有完整實現HTTP 1.1的協議,所以官方文檔是推薦用戶在生產環境下在前端使用nginx,后端反向代理到多個Tornado實例。

?

Tornado本身是單線程的異步網絡程序,它默認啟動時,會根據CPU數量運行多個實例;充分利用CPU多核的優勢。

?

===== 單線程異步 =====

網站基本都會有數據庫操作,而Tornado是單線程的,這意味著如果數據庫查詢返回過慢,整個服務器響應會被堵塞。

?

數據庫查詢,實質上也是遠程的網絡調用;理想情況下,是將這些操作也封裝成為異步的;但Tornado對此并**沒有**提供任何支持。

?

這是Tornado的**設計**,而不是缺陷。

?

一個系統,要滿足高流量;是必須解決數據庫查詢速度問題的!

?

數據庫若存在查詢性能問題,整個系統無論如何優化,數據庫都會是瓶頸,拖慢整個系統!

?

異步并**不能**從本質上提到系統的性能;它僅僅是避免多余的網絡響應等待,以及切換線程的CPU耗費。

?

如果數據庫查詢響應太慢,需要解決的是數據庫的性能問題;而不是調用數據庫的前端Web應用。

?

對于實時返回的數據查詢,理想情況下需要確保所有數據都在內存中,數據庫硬盤IO應該為0;這樣的查詢才能足夠快;而如果數據庫查詢足夠快,那么前端web應用也就無將數據查詢封裝為異步的必要。

?

就算是使用協程,異步程序對于同步程序始終還是會提高復雜性;需要衡量的是處理這些額外復雜性是否值得。

?

如果后端有查詢實在是太慢,無法繞過,Tornaod的建議是將這些查詢在后端封裝獨立封裝成為HTTP接口,然后使用Tornado內置的異步HTTP客戶端進行調用。

轉載于:https://www.cnblogs.com/duanxz/p/5428525.html

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

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

相關文章

廣義動量定理之速度V的應用分析

廣義動量定理之速度V的應用分析 從廣義動量定理FαtnmV的角度說&#xff0c;改變速度V&#xff0c;就可以改變成果nmV。速度派以改變速度V作為其主要目的。 速度V應用于兵貴神速 理論簡介&#xff1a;三國時期曹操的謀士郭嘉說&#xff1a;“兵貴神速”。 孫子在九地篇中說“兵…

云安全聯盟發布更新版安全應用指南

本文講的是云安全聯盟發布更新版安全應用指南【IT168 資訊】云安全聯盟(CSA)本周四發布了云計算服務的第二版安全應用指南。這一非營利性質的聯盟正式成立于四月份&#xff0c;其目的是推進云計算安全的最佳實踐。他們在2009 RSA會議(全球信息安全領域最具權威的年度峰會)上發布…

[BZOJ1026] [SCOI2009] windy數 (數位dp)

Description windy定義了一種windy數。不含前導零且相鄰兩個數字之差至少為2的正整數被稱為windy數。 windy想知道&#xff0c;在A和B之間&#xff0c;包括A和B&#xff0c;總共有多少個windy數&#xff1f; Input 包含兩個整數&#xff0c;A B。 Output 一個整數 Sample Input…

JQuery ajax()實例

前端頁面&#xff1a; <!doctype html><html><head><meta charset"utf-8"><title>搜索</title></head> <body><div class"zgz">請輸入(A-Z):<input type"text" value"GET"&…

黑馬數據庫html階段考試,黑馬web階段web試題學生版.docx

Web 階段 Web 試題1. 動態網站的開發技術有 (A)JSPHTMLCSSJavaScript 下面哪個請求頭信息可以實現防盜鏈 (C)LocationRefreshRefererIf-Modified-Since在Web應用程序的文件與目錄結構中&#xff0c;是放置在(A )WEB-INF 目錄conf 目錄lib 目錄classes 目錄下面哪一個指明向客戶…

學生信息管理系統中遇到的問題解析

項目概述&#xff1a;做一個簡單的學生信息管理系統 要求&#xff1a;學生信息的增刪查改&#xff0c;成績的增刪。自動生成的編號。 工具&#xff1a;微軟企業庫與MiniUI 遇到的問題與解決方法&#xff1a;&#xff08;前面的博文也有類似的問題和解決方法&#xff0c;這里不再…

簡單地使用線程之一:使用異步編程模型

.NetFramework的異步編程模型從本質上來說是使用線程池來完成異步的任務&#xff0c;異步委托、HttpWebRequest等都使用了異步模型。 這里我們使用異步委托來說明異步編程模型。 首先&#xff0c;我們來明確一下&#xff0c;對于多線程來說&#xff0c;我們需要關注哪些問題。 …

ShowType=0,交換機命令showinterfacestype0/port_#switchport|trunk用于顯 - 信管網

交換機命令show interfaces type0/port_# switchport|trunk用于顯示中繼連接的配置情況&#xff0c;下面是顯示例子&#xff1a;2950#show interface fastEthernet0/1 switchportName: fa0/1Switchport: EnabledAdministrative mode: trunkOperational Mode: trunkAdministrati…

SQL SERVER學習筆記(二)數據庫管理

第二部分&#xff1a;數據庫管理 單詞記憶&#xff1a;transact&#xff1a;處理 create&#xff1a;創建 execute&#xff1a;執行、完成 一、 SQL Server的特性 1、 安裝簡便&#xff1a;為了便于安裝、使用和管理&#xff0c;SQL Server2000提供了一組管理和開發工具。 …

SQL——快速定位相關的外鍵表

轉載于:https://www.cnblogs.com/mingle/p/4506422.html

Linux安裝glibc(升級版本)

2019獨角獸企業重金招聘Python工程師標準>>> glibc下載地址&#xff1a;http://ftp.gnu.org/gnu/glibc/ 這里下載 glibc-2.15&#xff1a; http://ftp.gnu.org/gnu/glibc/glibc-2.15.tar.gz glibc-ports-2.15&#xff1a; http://ftp.gnu.org/gnu/glibc/glibc-ports…

定義列表的特點html,HTML的列表表格表單知識點

無序列表格式 有序列表格式第一項 …

Javascript 獲取url參數,hash值 ,cookie

/*** 獲取請求參數* param key* returns {*}*/ function getRequestParameter(key){var params getRequestParameters();return params[key]; }/*** 獲取請求參數列表* returns {{}}*/ function getRequestParameters(){var arr (location.search || "").replace(/…

C# 中使用 ThoughtWorks.QRCode.dll 生成指定尺寸和邊框寬度的二維碼

本文介紹在 C# 中使用 ThoughtWorks.QRCode.dll 生成指定尺寸和邊框寬度的二維碼。網上文章大多只是簡單介紹內置參數的設置&#xff0c;根據我的使用目的&#xff0c;增加了自定義目標二維碼圖片尺寸和白邊邊框。有需要的朋友們可以試一下&#xff0c;如有bug歡迎指正。 首先&…

html設置百度協議,網站HTML結構SEO要求說明(含移動站)

網頁結構一、網頁中主體結構標簽一一對應。網頁頭部區域網頁底部區域網頁邊框區域網頁導航區域網頁章節、頁眉、頁腳詳情頁文章區域詳情頁作者信息詳情頁中文章的發布日期列表頁中文章列表區域二、其他說明1、首頁head中標注Meta標簽協議&#xff0c;標識對應的網頁瀏覽&#x…

【Fanvas技術解密】HTML5 canvas實現臟區重繪

先說明一下&#xff0c;fanvas是筆者在企鵝公司開發的&#xff0c;即將開源的flash轉canvas工具。 臟區重繪(dirty rectangle)并不是一門新鮮的技術了&#xff0c;這在最早2D游戲誕生的時候就已經存在。 復雜的術語或概念就不多說&#xff0c;簡單說&#xff0c;臟區重繪就是每…

javascript 學習教程

1&#xff0c;JavaScript 是一種輕量級的編程語言&#xff0c;是可插入 HTML 頁面的編程代碼。 2,以<script>標簽開始&#xff0c;以</script>標簽結束。 3,引用放在外部文件的擴展名為.js的腳本文件 <script src"myScript.js"></script> 4&…

我國非按勞分配收入

我國現階段非按勞分配收入探討 我國社會主義初級階段的個人消費品分配&#xff0c;是通過多種分配方式實現的。除了占主體地位的按勞分配方式之外&#xff0c;還存在許多種類的非按勞分配方式。因此&#xff0c;在我國城鄉居民個人收入總額中&#xff0c;除了一部分按勞分配收入…

html調用js里面的函數,html如何調用js函數

html調用js函數的方法&#xff1a;1、用控件本身進行調用&#xff1b;2、通過javascript中的時間控件定時執行&#xff1b;3、通過getElementById調用&#xff1b;4、通過document.getElementsByName調用。本文操作環境&#xff1a;Windows7系統、html5&&javascript1.8…

大部分人都會做錯的經典JS閉包面試題

2019獨角獸企業重金招聘Python工程師標準>>> 由工作中演變而來的面試題 JS中有幾種函數 創建函數的幾種方式 三個fun函數的關系是什么&#xff1f; 函數作用域鏈的問題 到底在調用哪個函數&#xff1f; 后話 轉載于:https://my.oschina.net/u/3687565/blog/1549046