Tornado簡介

Tornado簡介:

Tornado是什么
  • Tornado是由python開發(fā)的Web框架。
Tornado可以做什么
  • 利用Tornado可以快速搭建一個高性能的web服務(wù)。
Tornado優(yōu)點(diǎn)是什么
  • Tornado是單線程異步的非阻塞服務(wù)器,因此速度非??欤鄬τ谝话闱闆r下來說,如果同時連接數(shù)Django為3000個左右,那么Tornado為10000個。
Tornado學(xué)習(xí)如何
  • Tornado的學(xué)習(xí)成本非常低,是個非常容易學(xué)習(xí)使用的Web框架。

環(huán)境搭建:

1.虛擬機(jī)環(huán)境搭建如之前Django所講,虛擬機(jī)中創(chuàng)建虛擬環(huán)境,安裝對應(yīng)的包,這里需要安裝pip install tornado;其他和Django一樣;
2.在pycharm創(chuàng)建工程有別于Django創(chuàng)建,只需要創(chuàng)建普通python工程即可,然后再配置遠(yuǎn)程連接,自動同步等如Django前面所講;

Tornado代碼簡單例子:

import tornado.ioloop   #開啟循環(huán),讓服務(wù)一直等待請求的到來
import tornado.web  #web服務(wù)基本功能都封裝在此模塊中

class IndexHandler(tornado.web.RequestHandler):          #在這里指定請求的資源,類似Django視圖
    def get(self):
        self.write("Hello Tornado!")
application = tornado.web.Application([         #定義路由表
    (r"/",IndexHandler),    #根據(jù)路由配置,獲取什么資源,類似django url配置。
])
if __name__ == "__main__": #當(dāng).py文件被直接運(yùn)行時,if __name__ == '__main__'之下的代碼塊將被運(yùn)行;當(dāng).py文件以模塊形式被導(dǎo)入時,if __name__ == '__main__'之下的代碼塊不被運(yùn)行。
    application.listen(8000) #創(chuàng)建了一個http服務(wù)器示例并綁定到給定端口,用此端口監(jiān)聽
    tornado.ioloop.IOLoop.instance().start() #啟動IOLoop實(shí)例的I/O循環(huán),同時服務(wù)器監(jiān)聽被打開。一直運(yùn)行

路由

在tornado web框架中,路由表中的任意一項(xiàng)是一個元組,每個元組包含pattern(模式)和handler(處理器)。當(dāng)httpserver接收到一個http請求,server從接收到的請求中解析出url path(http協(xié)議start line中),然后順序遍歷路由表,如果發(fā)現(xiàn)url path可以匹配某個pattern,則將此http request交給web應(yīng)用中對應(yīng)的handler去處理。
由于有了url路由機(jī)制,web應(yīng)用開發(fā)者不必和復(fù)雜的http server層代碼打交道,只需要寫好web應(yīng)用層的邏輯(handler)即可。Tornado中每個url對應(yīng)的是一個類。

啟動Tornado

  • tornado支持通過命令行參數(shù)來控制啟動
import tornado.httpserver
import tornado.ioloop
import tornado.options     #從命令行種讀取設(shè)置
import tornado.web

from tornado.options import define,options

#定義端口為8080
define('port',default=8080,help='run port',type=int)
define('version', default='0.0.1', help='version 0.0.1', type=str)

class IndexHandler(tornado.web.RequestHandler):
    def get(self):
        self.write('welcome to index page!')

class LoginHandler(tornado.web.RequestHandler):
    def get(self):
        self.write('please login!')


app = tornado.web.Application([
    (r'/', IndexHandler),
    (r'/login', LoginHandler),
])

if __name__ == '__main__':
    tornado.options.parse_command_line()
    http_server = tornado.httpserver.HTTPServer(app)

    #如果一個與define語句中同名的設(shè)置在命令行中被給出,那么它將成為全局的options的一個屬性 即 options.port 相當(dāng)于define的url的port
    http_server.listen(options.port) #python test2.py --port=8000 給定了8000端口,覆蓋define的

    tornado.ioloop.IOLoop.instance().start()

使用 python test2.py --port=8000啟動,瀏覽器輸入url


image.png

輸入輸出

import tornado.httpserver
import tornado.ioloop
import tornado.options     #從命令行種讀取設(shè)置
import tornado.web

from tornado.options import define,options
#定義端口為8080
define('port',default=8080,help='run port',type=int)
define('version', default='0.0.1', help='version 0.0.1', type=str)

class IndexHandler(tornado.web.RequestHandler):
    def get(self):
        self.write('welcome to index page!') #輸出,類似Django中return HttpResponse('test')

class LoginHandler(tornado.web.RequestHandler):
    def get(self):
        self.write('please login!')
        name = self.get_argument('name','') #獲取url參數(shù)值,如果為空則給默認(rèn)值,類似Django中request.GET.get("name","")
        self.write('<br/>get_argument->name:'+name)
        print(name)

        name = self.get_arguments('name') #得到參數(shù)值的列表,不能給默認(rèn)值
        self.write('<br/>')
        self.write('et_argument->names:'+','.join(name)) #將列表通過,拼接返回字符串
        print(name)

app = tornado.web.Application([
    (r'/', IndexHandler),
    (r'/login', LoginHandler),
])

if __name__ == '__main__':
    tornado.options.parse_command_line()
    http_server = tornado.httpserver.HTTPServer(app)

    #如果一個與define語句中同名的設(shè)置在命令行中被給出,那么它將成為全局的options的一個屬性 即 options.port 相當(dāng)于define的url的port
    http_server.listen(options.port) #python test2.py --port=8000 給定了8000端口,覆蓋define的

    tornado.ioloop.IOLoop.instance().start()

啟動服務(wù):
python test2.py --port=8000
瀏覽器輸入

image.png

總結(jié):

  • 路由的定義和作用
  • Handler的定義和作用
  • 命令行傳入?yún)?shù)的方法和方式
  • 輸入輸出,write,get_argument / get_arguments,url傳入?yún)?shù)的方法
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 引言 以Django為代表的python web應(yīng)用部署時采用wsgi協(xié)議與服務(wù)器對接(被服務(wù)器托管),而這類服務(wù)...
    大熊_7d48閱讀 2,129評論 0 3
  • # Python 資源大全中文版 我想很多程序員應(yīng)該記得 GitHub 上有一個 Awesome - XXX 系列...
    小邁克閱讀 3,127評論 1 3
  • # Python 資源大全中文版 我想很多程序員應(yīng)該記得 GitHub 上有一個 Awesome - XXX 系列...
    aimaile閱讀 26,838評論 6 427
  • 原創(chuàng) 文 夏瑜斐 一次偶然,一個幸運(yùn)又幸福的機(jī)會,我利用本地資源給小班成功上了一節(jié)美術(shù)專家點(diǎn)評課,課件是《一盤點(diǎn)心...
    夏瑜斐的小木屋閱讀 766評論 1 4
  • 愛情是什么? 我曾熱烈的追求它 直到荊棘刺穿我的身體, 我還流著血 張開殘缺的翅膀 想飛到那神秘的天堂 或者地獄。...
    拈花醉流景閱讀 305評論 0 4

友情鏈接更多精彩內(nèi)容