Tornado 零基础完整学习教程
一、Tornado 框架简介
1.1 什么是 Tornado
Tornado 是一款基于 Python 的异步非阻塞、高并发 Web 框架,由 FriendFeed 开发、后被 Facebook 开源,专为高并发长连接场景设计。和 Django、Flask 等同步框架不同,Tornado 依托 IOLoop 事件循环 实现单线程高并发,性能极强,擅长处理海量长连接、实时请求场景。
1.2 核心特点
-
异步非阻塞:基于 epoll/kqueue 事件驱动模型,支持超高并发
-
原生支持长连接:完美适配 WebSocket、实时推送、IM 聊天场景
-
轻量简洁:无冗余组件,架构简单,学习成本低
-
自带异步库:内置 IOLoop、IOStream、协程工具,无需额外依赖
-
兼容同步写法:支持同步、异步两种编码模式,适配新旧业务
1.3 适用场景
-
高并发接口服务、秒杀、流量网关
-
实时 Web 服务、WebSocket 长连接、消息推送
-
中小型轻量化 Web 项目、内部工具服务
1.4 和其他框架区别
-
Django:大而全、同步阻塞、适合传统业务后台
-
Flask:轻量同步、灵活扩展,并发能力弱
-
FastAPI:现代异步、语法简洁、自动文档
-
Tornado:老牌成熟异步、长连接最强、生产稳定性极高
二、环境搭建
2.1 安装 Tornado
支持 Python3.7+ 所有版本,执行安装命令:
pip install tornado
2.2 验证安装
python -c "import tornado;print(tornado.version)"
输出版本号即安装成功。
三、第一个 Tornado 程序(HelloWorld)
搭建最简 Web 服务,理解 Tornado 核心运行流程
# main.py
import tornado.ioloop
import tornado.web
# 路由处理类
class MainHandler(tornado.web.RequestHandler):
# 处理GET请求
def get(self):
self.write("Hello Tornado!高并发Web框架")
# 初始化应用
def make_app():
return tornado.web.Application([
(r"/", MainHandler) # 路由映射:地址 -> 处理类
])
if __name__ == "__main__":
app = make_app()
app.listen(8000) # 监听8000端口
print("服务启动成功:http://127.0.0.1:8000")
tornado.ioloop.IOLoop.current().start() # 启动事件循环
运行项目
python main.py
访问 http://127\.0\.0\.1:8000 即可看到页面内容。
3.1 核心执行流程
-
定义 RequestHandler 子类:处理具体请求
-
Application 注册路由规则
-
监听端口,绑定服务
-
启动 IOLoop 事件循环,持续监听请求
四、基础路由与请求处理
4.1 多路由配置
支持多接口路由、动态路由参数,适配常规接口开发
import tornado.ioloop
import tornado.web
class IndexHandler(tornado.web.RequestHandler):
def get(self):
self.write("首页页面")
class UserHandler(tornado.web.RequestHandler):
# 动态路由参数:user_id
def get(self, user_id):
self.write(f"用户ID:{user_id}")
def make_app():
return tornado.web.Application([
(r"/", IndexHandler),
(r"/user/(\d+)", UserHandler) # 正则匹配动态参数
])
if __name__ == "__main__":
app = make_app()
app.listen(8000)
tornado.ioloop.IOLoop.current().start()
访问 http://127\.0\.0\.1:8000/user/1001 可获取动态参数。
4.2 常用请求方法
重写类方法支持 GET、POST、PUT、DELETE 请求
class TestHandler(tornado.web.RequestHandler):
def get(self):
self.write("GET 请求")
def post(self):
self.write("POST 请求")
def put(self):
self.write("PUT 请求")
def delete(self):
self.write("DELETE 请求")
4.3 获取请求参数
class ParamHandler(tornado.web.RequestHandler):
def get(self):
# 获取GET参数,设置默认值
name = self.get_argument("name", "默认名称")
age = self.get_argument("age", 18)
self.write(f"姓名:{name},年龄:{age}")
def post(self):
# 获取POST表单参数
username = self.get_body_argument("username")
password = self.get_body_argument("password")
self.write(f"账号:{username},密码:{password}")
五、异步编程核心(Tornado 重点)
Tornado 高性能的核心是异步协程,彻底解决同步阻塞问题。
5.1 同步阻塞问题
普通同步代码遇到耗时操作(数据库、网络请求)会阻塞整个服务,无法处理新请求。
5.2 异步协程写法
使用 async/await 实现异步非阻塞,Tornado 原生支持
import tornado.ioloop
import tornado.web
import asyncio
class AsyncHandler(tornado.web.RequestHandler):
# 异步请求处理
async def get(self):
# 模拟耗时异步操作,不阻塞服务
await asyncio.sleep(2)
self.write("异步请求处理完成,无阻塞!")
def make_app():
return tornado.web.Application([
(r"/async", AsyncHandler)
])
if __name__ == "__main__":
app = make_app()
app.listen(8000)
tornado.ioloop.IOLoop.current().start()
多个请求同时访问,不会互相阻塞,并发能力大幅提升。
六、模板渲染与静态文件
Tornado 自带模板引擎,支持模板继承、变量渲染、循环判断,无需额外前端框架。
6.1 项目目录
tornado-demo/
├── main.py
├── static/ # 静态文件目录(css/js/img)
└── templates/ # 模板文件目录
└── index.html
6.2 配置模板与静态路径
import tornado.ioloop
import tornado.web
import os
class IndexHandler(tornado.web.RequestHandler):
def get(self):
# 传递变量到模板
data = {
"title": "Tornado模板页面",
"name": "测试用户",
"list_data": [1,2,3,4]
}
self.render("index.html", **data) # 渲染模板
def make_app():
# 配置模板、静态文件路径
return tornado.web.Application(
[
(r"/", IndexHandler)
],
template_path=os.path.join(os.getcwd(), "templates"), # 模板目录
static_path=os.path.join(os.getcwd(), "static"), # 静态文件目录
debug=True # 调试模式,修改代码自动重启
)
if __name__ == "__main__":
app = make_app()
app.listen(8000)
tornado.ioloop.IOLoop.current().start()
6.3 模板文件(templates/index.html)
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>{{ title }}</title>
</head>
<body>
<h1>欢迎 {{ name }}</h1>
<!-- 循环遍历 -->
<ul>
{% for item in list_data %}
<li>{{ item }}</li>
{% end %}
</ul>
<!-- 条件判断 -->
{% if name == "测试用户" %}
<p>当前为测试账号</p>
{% end %}
</body>
</html>
七、JSON 接口开发(常用)
前后端分离开发中,直接返回 JSON 数据,适配前端接口请求
import tornado.ioloop
import tornado.web
import json
class JsonHandler(tornado.web.RequestHandler):
def set_default_headers(self):
# 设置跨域和响应头
self.set_header("Content-Type", "application/json; charset=utf-8")
self.set_header("Access-Control-Allow-Origin", "*")
def get(self):
res = {
"code": 200,
"msg": "请求成功",
"data": {
"name": "Tornado",
"version": "6.4.1"
}
}
self.write(json.dumps(res, ensure_ascii=False))
def make_app():
return tornado.web.Application([
(r"/api/data", JsonHandler)
])
if __name__ == "__main__":
app = make_app()
app.listen(8000)
tornado.ioloop.IOLoop.current().start()
八、WebSocket 实时通信(Tornado 王牌功能)
Tornado 原生完美支持 WebSocket,是 Python 框架中长连接最优方案,适合聊天、推送、实时监控。
import tornado.ioloop
import tornado.web
import tornado.websocket
# 存储在线连接
online_clients = set()
# WebSocket处理类
class WebSocketHandler(tornado.websocket.WebSocketHandler):
# 建立连接
def open(self):
online_clients.add(self)
print("客户端连接成功")
# 接收客户端消息
def on_message(self, message):
print(f"收到消息:{message}")
# 广播消息给所有在线客户端
for client in online_clients:
client.write_message(f"服务端收到:{message}")
# 连接关闭
def on_close(self):
online_clients.remove(self)
print("客户端断开连接")
def make_app():
return tornado.web.Application([
(r"/ws", WebSocketHandler)
])
if __name__ == "__main__":
app = make_app()
app.listen(8000)
print("WebSocket服务启动:ws://127.0.0.1:8000/ws")
tornado.ioloop.IOLoop.current().start()
九、项目分层规范(企业级)
小型项目可单文件运行,正式项目推荐分层结构,易维护、可扩展
tornado-project/
├── main.py # 项目入口
├── config.py # 配置文件
├── static/ # 静态资源
├── templates/ # 模板文件
├── api/ # 接口层
│ ├── __init__.py
│ └── user.py # 用户相关接口
└── utils/ # 工具类
└── response.py # 统一返回格式
十、常见问题与注意事项
-
异步禁忌:异步接口中禁止使用 time.sleep、同步数据库请求等阻塞代码,会直接拖垮并发性能
-
调试模式:debug=True 仅用于开发环境,生产环境必须关闭
-
跨域问题:前后端分离项目需手动配置跨域响应头
-
长连接优势:高并发、WebSocket 场景优先选 Tornado,普通 CRUD 业务可按需选择 FastAPI
-
端口占用:启动前检查端口是否被占用,修改监听端口即可解决
十一、学习进阶方向
-
Tornado + MySQL/Redis 数据库异步操作
-
WebSocket 多人聊天室、消息推送实战
-
全局异常处理、日志封装、统一接口返回
-
多进程部署、Nginx 反向代理上线
-
结合协程实现高并发爬虫、接口网关
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)