tornado框架介紹


一、安裝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。

本篇的內容主要剖析【啟動程序階段】,下面我們就來一步一步的剖析整個過程,在此階段主要是有下面重點標注的三個方法來實現。

 
       


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM