Tornado是使用Python开发的全栈式(full-stack)Web框架和异步网络库,最早由4名Google前软件工程师(布雷特·泰勒)2007创办的Friendfeed(一个社交聚合网站)开发而来的。通过使用非阻塞IO,Tornado可以处理数以万计的开放连接,是long polling、WebSockets和其他需要为用户维护长连接应用的理想选择。
目前最新版本6.1, 我们实际项目开发是使用的不可能是最新版本,所以在此我们在tornado基础阶段所学所用的版本为6.0.
开源的轻量级全栈式Web框架,提供了一整套完善的异步编码方案。
高性能
基于协程,底层就是基于asyio来实现的完整的协程调度
采用异步非阻塞IO处理方式,不依赖多进程或多线程
采用单进程单线程异步IO的网络模式,其高性能源于Tornado基于Linux的Epoll(UNIX为kqueue)的异步网络IO,具有出色的抗负载能力
Tornado为了实现高并发和高性能,使用了一个IOLoop
事件循环来处理socket
的读写事件
WSGI全栈替代产品,Tornado把应用(Application)和服务器(Server)结合起来,既是WSGI应用也可以是WSGI服务,通俗来讲就是说,Tornado既是web服务器也是web框架,甚至可以通过Tornado替代uwsgi/gunicorn来运行Flask或者django框架
RequestHandler
类, 还有很多其它支持的类).HTTPServer
和 AsyncHTTPClient
).IOLoop
和 IOStream
), 对 HTTP 的实现提供构建模块, 还可以用来实现其他协议.tornado.gen
) 让用户通过更直接的方法来实现异步编程, 而不是通过回调的方式.pip3 install tornado==6.0.4
基本写法如下:
server.py:
from tornado import ioloop
from tornado import web
class Home(web.RequestHandler):
def get(self):
# self.write 响应数据
self.write("hello!")
def make_app():
# Application是tornado web框架的核心应用类,是与服务器对应的接口,里面保存了路由映射表
# handlers 设置路由列表
return web.Application(handlers=[
(r'/',Home)
])
if __name__ == "__main__":
# 创建应用实例对象
app = make_app()
# 设置监听的ip和端口
app.listen(8888)
# ioloop,全局的tornado事件循环,是服务器的引擎核心,start表示创建IO事件循环,等待客户端连接
ioloop.IOLoop.current().start()
from tornado import ioloop
from tornado import web
from tornado import autoreload
from tornado.options import define,options,parse_command_line
# 配置信息
settings = {
'debug':True
}
define("port",default=8888,type=int,help="设置监听端口号,默认8888")
# 类视图
class Home(web.RequestHandler):
def get(self):
# self.write 响应数据
self.write("hello!")
def make_app():
# Application是tornado web框架的核心应用类,是与服务器对应的接口,里面保存了路由映射表
# handlers 设置路由列表
return web.Application(handlers=[
(r'/',Home)
],**settings) #加载配置
if __name__ == "__main__":
# 解析终端启动命令,格式:python server.py --port=端口号
parse_command_line()
# 创建应用实例对象
app = make_app()
# 设置监听的ip和端口
app.listen(options.port)
# ioloop,全局的tornado事件循环,是服务器的引擎核心,start表示创建IO事件循环,等待客户端连接
ioloop.IOLoop.current().start()
from tornado import ioloop
from tornado import web
from tornado.options import define,options,parse_command_line
# 配置信息
settings = {
'debug':True
}
# 类视图
class Home(web.RequestHandler):
def get(self):
# self.write 响应数据
self.write("hello!")
url = [
(r"/",Home)
]
if __name__ == "__main__":
define("port", default=8888, type=int, help="设置监听端口号,默认8888")
define("host", default="127.0.0.1", type=str)
define("debug", default=False, type=bool)
# 解析终端启动命令,格式:python server.py --port=端口号
parse_command_line()
# 路由,创建应用实例对象,
app = web.Application(
url,
**settings
)
# 设置监听的ip和端口
app.listen(options.port)
# ioloop,全局的tornado事件循环,是服务器的引擎核心,start表示创建IO事件循环,等待客户端连接
ioloop.IOLoop.current().start()
from tornado import ioloop
from tornado import web
from tornado.options import define,options,parse_command_line
# 配置信息
settings = {
'debug':True
}
# 类视图
class Home(web.RequestHandler):
def get(self):
# self.write 响应数据
self.write("hello!
") #可以写html标签
def post(self):
self.write("hello!post")
def put(self):
self.write("hello!put")
def delete(self):
self.write("hello!delete")
url = [
(r"/",Home)
]
if __name__ == "__main__":
define("port", default=8888, type=int, help="设置监听端口号,默认8888")
define("host", default="127.0.0.1", type=str)
define("debug", default=False, type=bool)
# 解析终端启动命令,格式:python server.py --port=端口号
parse_command_line()
# 路由,创建应用实例对象,
app = web.Application(
url,
**settings
)
# 设置监听的ip和端口
app.listen(options.port)
# ioloop,全局的tornado事件循环,是服务器的引擎核心,start表示创建IO事件循环,等待客户端连接
ioloop.IOLoop.current().start()
在tornado中,我们可以指定启动多进程:
from tornado import ioloop
from tornado import web,httpserver
from tornado.options import define,options,parse_command_line
# 配置信息
settings = {
'debug':False
}
define("port", default=8888, type=int, help="设置监听端口号,默认8888")
define("host", default="127.0.0.1", type=str)
define("debug", default=False, type=bool)
# 类视图
class Home(web.RequestHandler):
def get(self):
# self.write 响应数据
self.write("hello!")
def post(self):
self.write("hello!post")
def put(self):
self.write("hello!put")
def delete(self):
self.write("hello!delete")
url = [
(r"/",Home)
]
if __name__ == "__main__":
# 路由,创建应用实例对象,
app = web.Application(
url,
**settings
)
# 解析终端启动命令,格式:python server.py --port=端口号
parse_command_line()
server = httpserver.HTTPServer(app)
# 设置监听的ip和端口
server.bind(options.port)
# 0表示进程=cpu核数,1代表多开一个进程
server.start(0)
# ioloop,全局的tornado事件循环,是服务器的引擎核心,start表示创建IO事件循环,等待客户端连接
ioloop.IOLoop.current().start()
获取请求方法 | 作用 |
---|---|
self.settings | 获取当前配置信息 |
self.request | 获取http请求处理的实例对象 |
self.request.protocol | 获取通信协议 |
self.request.method | 获取请求方法 |
self.request.uri | 获取uri地址 |
self.request.full()_url | 获取完整url地址 |
self.request.version | 获取协议版本 |
self.request.headers | 获取请求头 |
self.request.host | 获取地址端口 |
self.request.request_time() | 获取请求时间 |
self.request.body | 获取请求体 |
self.request.files | 获取上传文件 |
self.request.cookie | 获取cookie |
self.request.remote_ip | 获取客户端地址 |
from tornado import ioloop
from tornado import web,httpserver
from tornado.options import define,options,parse_command_line
# 配置信息
settings = {
'debug':False
}
define("port", default=8888, type=int, help="设置监听端口号,默认8888")
define("host", default="127.0.0.1", type=str)
define("debug", default=False, type=bool)
# 类视图
class Home(web.RequestHandler):
def get(self):
# self.write 响应数据
print("通信协议: ", self.request.protocol) # 协议
print("请求方法: ", self.request.method) # Http请求方法
print("uri地址: ", self.request.uri) # uri地址
print("url地址: ", self.request.full_url()) # 完整url地址
print("协议版本: ", self.request.version) # 协议版本
print("请求头: ")
print(self.request.headers) # 请求头 HTTPHeaders
print("地址端口: ", self.request.host) # 地址端口
self.write("hello!")
url = [
(r"/",Home)
]
if __name__ == "__main__":
# 路由,创建应用实例对象,
app = web.Application(
url,
**settings
)
# 解析终端启动命令,格式:python server.py --port=端口号
parse_command_line()
server = httpserver.HTTPServer(app)
# 设置监听的ip和端口
server.bind(options.port)
# 0表示进程=cpu核数,1代表多开一个进程
server.start(0)
# ioloop,全局的tornado事件循环,是服务器的引擎核心,start表示创建IO事件循环,等待客户端连接
ioloop.IOLoop.current().start()
from tornado import ioloop
from tornado import web,httpserver
from tornado.options import define,options,parse_command_line
# 配置信息
settings = {
'debug':False
}
define("port", default=8888, type=int, help="设置监听端口号,默认8888")
define("host", default="127.0.0.1", type=str)
define("debug", default=False, type=bool)
# 类视图
class Home(web.RequestHandler):
def get(self):
# 获取name下第一个字符串参数
print(self.get_argument("name"))
# 获取name下所有字符串参数
print(self.get_arguments("name"))
self.write("hello!")
url = [
(r"/",Home)
]
if __name__ == "__main__":
# 路由,创建应用实例对象,
app = web.Application(
url,
**settings
)
# 解析终端启动命令,格式:python server.py --port=端口号
parse_command_line()
server = httpserver.HTTPServer(app)
# 设置监听的ip和端口
server.bind(options.port)
# 0表示进程=cpu核数,1代表多开一个进程
server.start(0)
# ioloop,全局的tornado事件循环,是服务器的引擎核心,start表示创建IO事件循环,等待客户端连接
ioloop.IOLoop.current().start()
1、获取json类型传参:
from tornado import ioloop
import json
from tornado import web,httpserver
from tornado.options import define,options,parse_command_line
# 配置信息
settings = {
'debug':False
}
define("port", default=8888, type=int, help="设置监听端口号,默认8888")
define("host", default="127.0.0.1", type=str)
define("debug", default=False, type=bool)
# 类视图
class Home(web.RequestHandler):
def get(self):
# 获取name下第一个字符串参数
print(self.get_argument("name"))
# 获取name下所有字符串参数
print(self.get_arguments("name"))
self.write("hello!")
def post(self):
#获取请求体json参数
data = self.request.body.decode()
print(json.loads(data).get("name"))
#获取表单第一个参数
# print(self.get_body_argument("name"))
#获取表单所有参数
# print(self.get_body_arguments("name"))
self.write("ok")
url = [
(r"/",Home)
]
if __name__ == "__main__":
# 路由,创建应用实例对象,
app = web.Application(
url,
**settings
)
# 解析终端启动命令,格式:python server.py --port=端口号
parse_command_line()
server = httpserver.HTTPServer(app)
# 设置监听的ip和端口
server.bind(options.port)
# 0表示进程=cpu核数,1代表多开一个进程
server.start(0)
# ioloop,全局的tornado事件循环,是服务器的引擎核心,start表示创建IO事件循环,等待客户端连接
ioloop.IOLoop.current().start()
2、传入表单数据获取参数
from tornado import ioloop
import json
from tornado import web,httpserver
from tornado.options import define,options,parse_command_line
# 配置信息
settings = {
'debug':False
}
define("port", default=8888, type=int, help="设置监听端口号,默认8888")
define("host", default="127.0.0.1", type=str)
define("debug", default=False, type=bool)
# 类视图
class Home(web.RequestHandler):
def get(self):
# 获取name下第一个字符串参数
print(self.get_argument("name"))
# 获取name下所有字符串参数
print(self.get_arguments("name"))
self.write("hello!")
def post(self):
#获取请求体json参数
# data = self.request.body.decode()
# print(json.loads(data).get("name"))
#获取表单第一个参数
print(self.get_body_argument("name"))
#获取表单所有参数
print(self.get_body_arguments("name"))
self.write("ok")
url = [
(r"/",Home)
]
if __name__ == "__main__":
# 路由,创建应用实例对象,
app = web.Application(
url,
**settings
)
# 解析终端启动命令,格式:python server.py --port=端口号
parse_command_line()
server = httpserver.HTTPServer(app)
# 设置监听的ip和端口
server.bind(options.port)
# 0表示进程=cpu核数,1代表多开一个进程
server.start(0)
# ioloop,全局的tornado事件循环,是服务器的引擎核心,start表示创建IO事件循环,等待客户端连接
ioloop.IOLoop.current().start()
只测有名分组,无名分组同理
from tornado import ioloop
import json
from tornado import web,httpserver
from tornado.options import define,options,parse_command_line
# 配置信息
settings = {
'debug':False
}
define("port", default=8888, type=int, help="设置监听端口号,默认8888")
define("host", default="127.0.0.1", type=str)
define("debug", default=False, type=bool)
# 类视图
class Home(web.RequestHandler):
def get(self,cat,id):
# 通过传参获取id
self.write("hello!%s,%s" % (cat,id))
url = [
(r"/(?P\d+)-(?P\d+).html" ,Home)
]
if __name__ == "__main__":
# 路由,创建应用实例对象,
app = web.Application(
url,
**settings
)
# 解析终端启动命令,格式:python server.py --port=端口号
parse_command_line()
server = httpserver.HTTPServer(app)
# 设置监听的ip和端口
server.bind(options.port)
# 0表示进程=cpu核数,1代表多开一个进程
server.start(0)
# ioloop,全局的tornado事件循环,是服务器的引擎核心,start表示创建IO事件循环,等待客户端连接
ioloop.IOLoop.current().start()