Tornado簡介:
Tornado是什么
- Tornado是由python開發(fā)的Web框架。
Tornado可以做什么
- 利用Tornado可以快速搭建一個高性能的web服務(wù)。
Tornado優(yōu)點是什么
- Tornado是單線程異步的非阻塞服務(wù)器思犁,因此速度非晨梗快,相對于一般情況下來說图甜,如果同時連接數(shù)Django為3000個左右伯顶,那么Tornado為10000個。
Tornado學(xué)習(xí)如何
- Tornado的學(xué)習(xí)成本非常低骆膝,是個非常容易學(xué)習(xí)使用的Web框架祭衩。
環(huán)境搭建:
1.虛擬機環(huán)境搭建如之前Django所講,虛擬機中創(chuàng)建虛擬環(huán)境阅签,安裝對應(yīng)的包掐暮,這里需要安裝pip install tornado;其他和Django一樣政钟;
2.在pycharm創(chuàng)建工程有別于Django創(chuàng)建路克,只需要創(chuàng)建普通python工程即可,然后再配置遠程連接养交,自動同步等如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文件被直接運行時廉嚼,if __name__ == '__main__'之下的代碼塊將被運行;當(dāng).py文件以模塊形式被導(dǎo)入時倒戏,if __name__ == '__main__'之下的代碼塊不被運行怠噪。
application.listen(8000) #創(chuàng)建了一個http服務(wù)器示例并綁定到給定端口,用此端口監(jiān)聽
tornado.ioloop.IOLoop.instance().start() #啟動IOLoop實例的I/O循環(huán),同時服務(wù)器監(jiān)聽被打開。一直運行
路由
在tornado web框架中杜跷,路由表中的任意一項是一個元組,每個元組包含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路由機制秦陋,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ù)的方法