Tornado框架part1

Tornado框架part1

  • 一、tornado介绍
    • 1、介绍
    • 2、特点
    • 3、主要部分
  • 二、项目的基本运行
    • 1、安装
    • 2、开启调试模式
    • 3、路由拆分
    • 4、视图编写
    • 5、多进程模式
  • 三、请求
    • 1、常见请求信息获取
    • 2、接收查询字符串
    • 3、接收请求体
    • 4、接收路由参数

一、tornado介绍

1、介绍

Tornado是使用Python开发的全栈式(full-stack)Web框架和异步网络库,最早由4名Google前软件工程师(布雷特·泰勒)2007创办的Friendfeed(一个社交聚合网站)开发而来的。通过使用非阻塞IO,Tornado可以处理数以万计的开放连接,是long polling、WebSockets和其他需要为用户维护长连接应用的理想选择。

目前最新版本6.1, 我们实际项目开发是使用的不可能是最新版本,所以在此我们在tornado基础阶段所学所用的版本为6.0.

2、特点

  • 开源的轻量级全栈式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框架

3、主要部分

  • Web 框架 (包括用来创建 Web 应用程序的 RequestHandler 类, 还有很多其它支持的类).
  • HTTP 客户端和服务器的实现 (HTTPServerAsyncHTTPClient).
  • 异步网络库 (IOLoopIOStream), 对 HTTP 的实现提供构建模块, 还可以用来实现其他协议.
  • 协程库 (tornado.gen) 让用户通过更直接的方法来实现异步编程, 而不是通过回调的方式.

二、项目的基本运行

1、安装

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()

运行后浏览器访问:
Tornado框架part1_第1张图片

2、开启调试模式

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()

运行结果:
运行

3、路由拆分

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()

运行结果:
运行结果

Tornado框架part1_第2张图片

4、视图编写

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框架part1_第3张图片

5、多进程模式

在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()

运行结果:
运行结果

三、请求

1、常见请求信息获取

获取请求方法 作用
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()

postman发送get请求后打印结果:
Tornado框架part1_第4张图片

2、接收查询字符串

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()

postman携带参数发出请求:
Tornado框架part1_第5张图片

打印结果:
运行结果

3、接收请求体

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()

postman发送post请求,输出结果:
Tornado框架part1_第6张图片

运行结果

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()

postman发送表单数据,输出结果:
Tornado框架part1_第7张图片

Tornado框架part1_第8张图片

4、接收路由参数

只测有名分组,无名分组同理

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()

postman查看返回结果:
Tornado框架part1_第9张图片

你可能感兴趣的:(python,python)