白話tornado原始碼(1):一個指令碼引發的血案

發表於2015-09-16

本系列博文計劃:

1、剖析基於Python的Web框架Tornado的原始碼

2、為Python開發一個完善的MVC框架

首先將帶著大家一起來剖析基於python編寫的Web框架 tornado ,本著易讀易懂的目標來寫這一系列,寄希讓小白也能zeng明白其中的道理,與其說剖析還不如說是白話,因為本系列都會用通俗的語言去描述Web框架中的各個知識點。

一個指令碼引發的一場“血案”….

執行指令碼並在瀏覽器上訪問http://127.0.0.1:8080

 

上述分析:

1、瀏覽器其實就是一個socket客戶端,而web應用其實就是一個socket服務端,並且web應用在伺服器上一直在監聽某個埠。

2、當瀏覽器請求某個web應用時,需要指定伺服器的IP(DNS解析)和埠建立一個socket連線。

3、建立連結後,web應用根據請求的不同,給使用者返回相應的資料。

4、斷開socket連線。(之所以說http是短連結,其實就是因為每次請求完成後,伺服器就會斷開socket連結)

對於Web框架來說,一般分為兩類,其中一類則是包含上述 4部分 內容的框架,另外一類就是隻包含 第3部分 功能的框架。tornado就是一中屬於前者的框架。tornado 是一個基於 Python 開發的web框架,較其他 Web 框架的區別是:採用了非阻塞的方式和對epoll的應用。這意味著對於實時 Web 服務來說,Tornado 是一個理想的 Web 框架。

初識tornado

上述用一個簡陋的demo展示了Web請求從瀏覽器到伺服器之間的流程,接下來就以上帝視角來對tornado框架做一個全域性的介紹。在使用tornado之前需要安裝,對於如何安裝這裡不做太多贅述,詳見官網

經典的hello world 案例:

執行該指令碼,依次執行:

  • 建立一個Application物件,並把一個正規表示式’/’和類名MainHandler傳入建構函式:tornado.web.Application(…)
  • 執行Application物件的listen(…)方法,即:application.listen(8888)
  • 執行IOLoop類的類的 start() 方法,即:tornado.ioloop.IOLoop.instance().start()

整個過程其實就是在建立一個socket服務端並監聽8888埠,當請求到來時,根據請求中的url和請求方式(post、get或put等)來指定相應的類中的方法來處理本次請求,在上述demo中只為url為http://127.0.0.1:8888/index的請求指定了處理類MainHandler(具體如何尋找見下文)。所以,在瀏覽器上訪問:http://127.0.0.1:8888/index,則伺服器給瀏覽器就會返回 Hello,world ,否則返回 404: Not Found(tornado內部定義的值), 即完成一次http請求和響應。

由上述分析,我們將整個Web框架分為兩大部分:

  • 待請求階段,即:建立服務端socket並監聽埠
  • 處理請求階段,即:當有客戶端連線時,接受請求,並根據請求的不同做出相應的相應

那麼在記下來的博文中將按照這兩種分類來進行剖析…

相關文章