Tornado源碼探尋(開篇)

1、先從一個簡單的socket提及

 

運行腳本並在瀏覽器上訪問http://127.0.0.1:8080python

#!/usr/bin/env python
#coding:utf-8
 
import socket
 
def handle_request(client):
    buf = client.recv(1024)
    client.send("HTTP/1.1 200 OK\r\n\r\n")
    client.send("Hello, Seven")
 
def main():
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.bind(('localhost',8080))
    sock.listen(5)
 
    while True:
        connection, address = sock.accept()
        handle_request(connection)
        connection.close()
 
if __name__ == '__main__':
    main()

上述分析:web

  一、瀏覽器其實就是一個socket客戶端,而web應用其實就是一個socket服務端,而且web應用在服務器上一直在監聽某個端口。正則表達式

  二、當瀏覽器請求某個web應用時,須要指定服務器的IP(DNS解析)和端口創建一個socket鏈接。瀏覽器

  三、創建連接後,web應用根據請求的不一樣,給用戶返回相應的數據。服務器

  四、斷開socket鏈接。(之因此說http是短連接,其實就是由於每次請求完成後,服務器就會斷開socket連接)app

對於Web框架來講,通常分爲兩類,其中一類則是包含上述 4部分 內容的框架,另一類就是隻包含 第3部分 功能的框架。tornado就是一中屬於前者的框架。框架

Tornado 是一個基於 Python 開發的web框架,較其餘 Web 框架的區別是:採用了非阻塞的方式和對epoll的應用。這意味着對於實時 Web 服務來講,Tornado 是一個理想的 Web 框架。socket

 

2、初識Tornado

在使用tornado以前須要安裝,對於如何安裝這裏不作太多贅述,詳見官網函數

經典的hello world 案例:tornado

import tornado.ioloop
import tornado.web
 
class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("Hello, world")
 
application = tornado.web.Application([
    (r"/index", MainHandler),
])
 
if __name__ == "__main__":
    application.listen(8888)
    tornado.ioloop.IOLoop.instance().start()

運行該腳本,依次執行:

  • 建立一個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並監聽端口
  • 處理請求階段,即:當有客戶端鏈接時,接受請求,並根據請求的不一樣作出相應的相應

 

未完待續……………………

相關文章
相關標籤/搜索