Tornado框架part1

本文详细介绍了Tornado框架,包括其起源、特点和主要部分。Tornado是一个高性能的Python Web框架,以其异步非阻塞IO和轻量级特性著称。文中还展示了项目的基本运行步骤,如安装、开启调试模式、路由拆分、视图编写以及多进程模式。在请求处理部分,讲解了如何获取请求信息、接收查询字符串、请求体以及路由参数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

运行后浏览器访问:
运行结果

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

运行结果:
运行结果

运行结果

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("<h1>hello!</h1>") #可以写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()

运行结果:
运行结果

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请求后打印结果:
打印结果

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携带参数发出请求:
运行结果

打印结果:
运行结果

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请求,输出结果:
运行结果

运行结果

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发送表单数据,输出结果:
运行结果

运行结果

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<cat>\d+)-(?P<id>\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查看返回结果:
postman

### Python Web开发框架概述 Python 是一种广泛应用于Web开发的语言,其拥有多个功能强大且灵活的Web开发框架。这些框架能够满足从小型应用到大型企业系统的多样化需求。 #### 常见的Python Web开发框架 以下是几个常见的Python Web开发框架及其特点: 1. **Tornado** - Tornado 是一个异步网络库以及基于该库构建的Web框架[^1]。它的设计目标是处理高并发请求,因此非常适合实时应用程序和需要高性能的应用场景。 2. **Flask** - Flask 是一个轻量级的WSGI微框架,提供了简单的API接口以便开发者快速上手[^2]。由于其灵活性强,适合用于小型项目或者作为其他更复杂的项目的组件。 3. **Django** - Django 是一个全栈式的Web框架,采用MTV(Model-Template-View)架构模式[^3]。它内置了许多实用的功能模块,比如ORM、管理后台、认证系统等,极大地提高了开发效率并减少了重复劳动的工作量。 #### 学习资源与教程建议 对于初学者来说,可以从官方文档入手学习各个框架的基础知识和技术细节。下面列举了一些针对上述提到的主要框架的学习资料链接或方向指引: - 对于想要深入了解 `Tornado` 的朋友可以访问官网获取最新版次的信息 https://www.tornadoweb.org/ 并按照其中提供的指南逐步实践操作; - 如果倾向于使用简洁明快的方式实现自己的想法,则可以选择研究一下由Pallets团队维护的 flask 官方网站 http://flask.pocoo.org/docs/latest/index.html 来熟悉整个生态系统; - 而如果追求全面解决方案的话那么毫无疑问应该优先考虑 django ,可以通过阅读django project主页上的入门系列文章https://docs.djangoproject.com/en/stable/intro/tutorial01/#writing-your-first-django-app-part-1 开始旅程吧! --- ### 示例代码展示 以下分别给出三个主流框架创建基本HTTP服务器的例子供参考对比理解它们之间的差异之处: ```python # 使用Tornado 创建最简服务端程序 import tornado.ioloop import tornado.web class MainHandler(tornado.web.RequestHandler): def get(self): self.write("Hello, world") def make_app(): return tornado.web.Application([ (r"/", MainHandler), ]) if __name__ == "__main__": app = make_app() app.listen(8888) tornado.ioloop.IOLoop.current().start() ``` ```python # 利用Flask 构建简易web server from flask import Flask app = Flask(__name__) @app.route('/') def hello_world(): return 'Hello, World!' if __name__ == '__main__': app.run(port=5000) ``` ```python # 配置Django工程下的urls.py文件定义根路径响应函数 from django.http import HttpResponse from django.urls import path def index(request): return HttpResponse("Hello, world!") urlpatterns = [ path('', index), # 将URL映射至视图function ] ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值