概要

本文介绍Tornado包的基本知识以及简单上手实例。

Tornado Web框架

Tornado是一个轻量级的Web框架,其特点包括:

  • 异步非阻塞IO处理方式
  • 服务端的实现相对容易,建立在TCP协议之上
  • 兼容http和https协议,默认端口80和443
  • 出色的抗负载能力
  • 其高性能来源于充分利用Linux的epoll工具和BSD的kqueue工具,不依赖多进程/线程

Tornado简单应用

例1:创建一个简单的web站点:

server01.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import tornado.web
import tornado.ioloop

class IndexHandler(tornado.web.RequestHandler):
# 处理get请求,不能处理post请求
def get(self,*args,**kwargs):
# 应对http请求的方法,给浏览器响应信息
self.write("Good day, commander!!!")

if __name__ == "__main__":
# tornado web框架的核心应用类,是与服务器对应的接口,里面保存了路由映射表,
# 有一个listen方法来创建一个http实例并绑定端口
app = tornado.web.Application([
(r"/",IndexHandler)
])
# 绑定监听端口
app.listen(2020)
# IOLoop.current() 返回当前线程的IOLoop对象,start():启动IO对象循环
tornado.ioloop.IOLoop.current().start()

启动服务:python server01.py。在浏览器中输入”本机ip:port”即可访问:

其原理如图所示:最外层是持续监听特定端口的ioloop,每当新的客户端连接时,就会产生一个对应的socket,中间层由Application封装实现地址路由,内核Handler才是真正的网页内容。

例2:带参数解析功能的简单实例:

server02.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import tornado.web
import tornado.ioloop
import tornado.httpserver
import tornado.options

# 默认参数
tornado.options.define("port",default=2020,type=int)
tornado.options.define("list",default=[],type=str,multiple=True)

class IndexHandler(tornado.web.RequestHandler):
# 处理get请求,不能处理post请求
def get(self,*args,**kwargs):
# 应对http请求的方法,给浏览器响应信息
self.write("Good day, commander!!! I am waiting for you!!!")

if __name__ == "__main__":
# 解析输入参数:(command line)
tornado.options.parse_command_line()
print("port = ",tornado.options.options.port)
print("list = ",tornado.options.options.list)
# tornado web框架的核心应用类,是与服务器对应的接口,里面保存了路由映射表,
# 有一个listen方法来创建一个http实例并绑定端口
app = tornado.web.Application([
(r"/",IndexHandler)
])
# 绑定监听端口
server = tornado.httpserver.HTTPServer(app)
server.bind(tornado.options.options.port)
server.start()

# IOLoop.current() 返回当前线程的IOLoop对象,start():启动IO对象循环
tornado.ioloop.IOLoop.current().start()

改动有两处:

  • 1 使用tornado.httpserver.HTTPServer.listen代替app.listen,直观看到服务器创建过程(实际效果是一样的,app封装得更多)
  • 2 使用tornado.options模块管理输入参数列表。define()定义默认参数和属性,parse_command_line()解析命令行输入参数。

带参数运行: python server03.py --port=2021 --list=abc,def,hji

参考