一、安裝tornado
手動安裝: 下載 tornado-1.2.1.tar.gz
tar xvzf tornado-1.2.1.tar.gz cd tornado-1.2.1 python setup.py build sudo python setup.py install
安裝要求:需要先安裝:python2.7
Mac OS X 10.6 (Python 2.6+) sudo easy_install setuptools pycurl Ubuntu Linux (Python 2.6+) sudo apt-get install python-pycurl Ubuntu Linux (Python 2.5) sudo apt-get install python-dev python-pycurl python-simplejson
安裝過程:
下載:tornado-1.2.1.tar.gz,解后解壓
開始安裝:
#先檢查是否是python2.7 C:\tornado-1.2.1>python Python 2.7.13 (v2.7.13:a06454b1afa1, Dec 17 2016, 20:53:40) [MSC v.1500 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> exit() #開始安裝 C:\tornado-1.2.1>python setup.py build C:\tornado-1.2.1>python setup.py install
二、介紹tornado
Tornado: 1. 版本 4.4 要求:1.2.1 環境:Python2.7 2. 源碼分析流程: a. python app.py - 加載路由關系 - 加載配置文件 - 啟動socket 作業: 經歷的類 創建對象后,對象中大概封裝了 類中的方法的執行流程 b. 用戶發請 - 匹配路由 - 執行指定類的方法 c. 異步非阻塞
三、簡單介紹tornado的使用
示例:
代碼:
app.py
#!/usr/bin/env python # -*- coding:utf-8 -*- import tornado.ioloop import tornado.web class MainHandler(tornado.web.RequestHandler): def get(self): self.write("Hello, world") class LoginHandler(tornado.web.RequestHandler): def get(self): # self.write("請登錄") self.render("login.html") def post(self, *args, **kwargs): v = self.get_argument('username') print(v) self.redirect('/index.html') settings = { 'template_path': 'templates', 'static_path': 'static', 'static_url_prefix': '/ppp/', } # application對象中封裝了:路由信息,配置信息 application = tornado.web.Application([ (r"/login.html", LoginHandler), (r"/index.html", MainHandler), ],**settings) # application.add_handlers('buy.oldboy.com',[ # (r"/login.html", LoginHandler), # (r"/index.html", MainHandler), # ]) if __name__ == "__main__": # 創建socket對象 # sock = socket.socket() # inputs = [socket,] application.listen(8888) # 開啟 r,w,e = select.select(inputs,) tornado.ioloop.IOLoop.instance().start()
login.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>登錄</h1> <form action="/login.html" method="POST"> <input type="text" name="username" placeholder="用戶名" /> <input type="submit" value="提交" /> </form> <img src="/ppp/1.png"> </body> </html>
用運行Python程序的方法運行,注意監聽的端口。
運行結果:
四、tornado源碼之待請求階段
上圖是tornado程序啟動以及接收到客戶端請求后的整個過程,對於整個過程可以分為兩大部分:
- 啟動程序階段,又稱為待請求階段(上圖1、2所有系列和3.0)
- 接收並處理客戶端請求階段(上圖3系列)
簡而言之:
1、在啟動程序階段,第一步,獲取配置文件然后生成url映射(即:一個url對應一個XXRequestHandler,從而讓XXRequestHandler來處理指定url發送的請求);第二步,創建服務器socket對象並添加到epoll中;第三步,創建無線循環去監聽epoll。
2、在接收並處理請求階段,第一步,接收客戶端socket發送的請求(socket.accept);第二步,從請求中獲取請求頭信息,再然后根據請求頭中的請求url去匹配某個XXRequestHandler;第三步,匹配成功的XXRequestHandler處理請求;第四步,將處理后的請求發送給客戶端;第五步,關閉客戶端socket。
本篇的內容主要剖析【啟動程序階段】,下面我們就來一步一步的剖析整個過程,在此階段主要是有下面重點標注的三個方法來實現。