今日目标:FastAPI 是当下最火的 Python Web 框架。今天我们不只是写个 “Hello World”,而是要彻底搞懂 “什么是 RESTful API”、“URL 如何传参”、“如何启动服务器” 以及 “Swagger 文档如何自动生成” 这四个核心问题。今天不只是写代码,而是要彻底理解 “FastAPI 为什么比 Flask 快”、“路径参数和查询参数的区别” 以及 “为什么需要 ASGI 服务器”。
学习内容 (30 mins)
在开始写代码前,先搞懂这些核心概念,否则后面的代码你会看得云里雾里。什么是 FastAPI?(10 mins)
什么是 FastAPI?(10 mins)
FastAPI 是什么?FastAPI 是一个现代、快速的 Python Web 框架,用于构建 API。它基于 Python 3.6+ 的类型提示(Type Hints)和异步编程(Async/Await)。为什么选择 FastAPI?
- 性能极快:基于 Starlette 和 Pydantic,性能接近 Node.js 和 Go
- 自动文档:自动生成 Swagger UI 和 ReDoc 文档
- 类型安全:基于 Python 类型提示,IDE 支持好
- 异步支持:原生支持异步编程,适合高并发场景
- 数据验证:基于 Pydantic,自动验证请求数据
- Flask:轻量级,但需要手动写很多代码(路由、验证、文档)
- Django:功能全面,但重量级,学习曲线陡
- FastAPI:现代化,自动生成文档,性能好,适合 API 开发
- 自动类型转换:URL 参数自动转换为指定类型
- 自动数据验证:基于 Pydantic 自动验证请求数据
- 自动文档生成:访问
/docs即可查看交互式 API 文档 - 异步支持:原生支持
async/await,适合高并发
RESTful API 基础 (10 mins)
RESTful API 基础 (10 mins)
什么是 RESTful API?REST(Representational State Transfer)是一种 API 设计风格,通过 HTTP 方法(GET、POST、PUT、DELETE)操作资源。RESTful 设计原则:
- 资源导向:URL 表示资源,如
/users、/servers - HTTP 方法:GET(查询)、POST(创建)、PUT(更新)、DELETE(删除)
- 状态码:200(成功)、201(创建)、400(错误)、404(未找到)
- 无状态:每个请求都是独立的,不依赖之前的请求
- 路径参数 (Path Parameters):
- 位置:URL 路径的一部分,如
/users/5中的5 - 用途:定位特定资源(获取 ID 为 5 的用户)
- 语法:在路径中写
{user_id},如/users/{user_id} - 示例:
GET /users/5- 获取 ID 为 5 的用户
- 位置:URL 路径的一部分,如
- 查询参数 (Query Parameters):
- 位置:URL 问号
?后面的键值对 - 用途:过滤、排序、分页
- 语法:函数参数,但不在路径中写
{xx} - 示例:
GET /users?limit=10&sort=age- 获取前 10 个用户,按年龄排序
- 位置:URL 问号
- 路径参数:获取详情、删除资源
- 查询参数:列表查询、搜索、分页、筛选
ASGI 服务器 (10 mins)
ASGI 服务器 (10 mins)
什么是 ASGI?ASGI(Asynchronous Server Gateway Interface)是 Python 异步 Web 服务器和框架之间的标准接口。为什么需要 ASGI 服务器?
- FastAPI 只是框架:它定义了路由、处理逻辑,但不负责监听端口
- Uvicorn 是服务器:负责监听 HTTP 请求,将请求转交给 FastAPI 处理
- 类比:FastAPI 是”厨师”(处理业务逻辑),Uvicorn 是”服务员”(接收订单并传递给厨师)
- 监听端口(默认 8000)
- 接收 HTTP 请求
- 将请求转交给 FastAPI 处理
- 将 FastAPI 的响应返回给客户端
15_main:Python 文件名(不含 .py)app:FastAPI 实例的变量名--reload:开发模式,代码修改后自动重启(生产环境不要用)
- 开发环境:直接使用
uvicorn(简单快速) - 生产环境:使用
gunicorn + uvicorn(多进程,更稳定)
代码任务 (90 mins)
环境准备
在开始之前,确保你的环境已准备好:为什么需要两个包?
- Python 环境:需要 Python 3.7+(推荐 3.9+)
- 虚拟环境:确保虚拟环境已激活(参考 Day 08)
- 文本编辑器:继续使用 nano 或 vi/vim(参考 Day 01)
- fastapi:Web 框架,定义路由和处理逻辑
- uvicorn:ASGI 服务器,负责监听端口和处理 HTTP 请求
- 检查 Python 版本是否符合要求
- 确认虚拟环境已激活
- 验证 fastapi 和 uvicorn 安装成功
任务 A:编写第一个 API
新建文件 代码解释:验证步骤:
15_main.py,实现第一个 FastAPI 应用。任务分解:- 创建 FastAPI 应用实例
- 定义根路由(GET /)
- 定义带路径参数的路由(GET /items/)
- FastAPI 实例:
app = FastAPI(...)创建应用实例 - 路由装饰器:
@app.get("/")定义 GET 路由 - 路径参数:
{item_id}在路径中,item_id: int自动类型转换 - 查询参数:函数参数不在路径中,自动识别为查询参数
- 默认值:
skip: int = 0设置默认值,参数可选
- 启动服务器后,访问
http://localhost:8000/- 应该看到:
{"message":"Hello, FastAPI!","status":"running"}
- 应该看到:
- 访问
http://localhost:8000/items/5- 应该看到:
{"item_id":5,"is_even":false}
- 应该看到:
- 访问
http://localhost:8000/items/abc- 应该看到错误:
{"detail":[{"loc":["path","item_id"],"msg":"value is not a valid integer"...}]} - 这说明 FastAPI 自动验证了类型
- 应该看到错误:
- 访问
http://localhost:8000/servers- 应该看到前 2 条记录(默认 limit=2)
- 访问
http://localhost:8000/servers?skip=1&limit=2- 应该看到从第 2 条开始的 2 条记录
任务 B:体验 Swagger UI 自动文档
FastAPI 的亮点:自动生成交互式 API 文档。访问 Swagger UI:
- 确保服务器正在运行(
uvicorn 15_main:app --reload) - 打开浏览器,访问:
http://localhost:8000/docs - 你会看到一个蓝色的界面,显示所有 API 端点
- 点击
/servers旁边的绿色 GET 按钮 - 点击右侧的 Try it out 按钮
- 在参数输入框中:
skip输入1limit输入2
- 点击蓝色大按钮 Execute
- 查看 Response Body,应该能看到
Server B和Server C
- 查看所有 API:自动列出所有定义的路由
- 查看参数说明:显示每个参数的类型、是否必需、默认值
- 在线测试:可以直接在浏览器中测试 API,无需 Postman
- 查看响应格式:显示 API 返回的数据结构
- Swagger UI:
http://localhost:8000/docs(交互式,推荐) - ReDoc:
http://localhost:8000/redoc(更美观的文档样式) - OpenAPI JSON:
http://localhost:8000/openapi.json(机器可读的 API 规范)
- 自动生成:不需要手写 API 文档,减少维护成本
- 实时同步:代码修改后,文档自动更新
- 交互测试:前端开发者可以直接在文档中测试 API
- 类型准确:基于代码生成,不会出现文档和代码不一致的问题
拓展任务 (30 mins)
挑战 1:添加更多路由
任务:添加以下路由:
GET /health- 返回健康检查信息GET /users/{user_id}/posts/{post_id}- 嵌套路径参数GET /search?q=keyword&page=1- 搜索接口(多个查询参数)
- 路径参数用
{变量名}定义 - 查询参数直接在函数参数中定义
- 可以组合使用路径参数和查询参数
挑战 2:理解类型转换
任务:尝试以下 URL,观察 FastAPI 如何处理类型转换:
GET /items/123- 整数GET /items/abc- 非整数(应该报错)GET /items/3.14- 浮点数(应该报错,因为类型是 int)
今日产出物
15_main.py- FastAPI 应用主文件- 运行中的 API 服务(可通过浏览器访问)
参考代码
查看参考代码
在 GitHub 查看完整的 FastAPI 示例代码
在线运行
使用在线编辑器测试 FastAPI
实际应用场景
FastAPI 在运维中的应用
- 监控 API:提供服务器监控数据的查询接口
- 配置管理:通过 API 管理服务器配置
- 日志查询:提供日志搜索和查询接口
- 自动化工具:为自动化脚本提供 RESTful API
- 微服务架构:构建轻量级微服务
RESTful API 设计最佳实践
- 资源命名:使用名词,如
/users、/servers,不要用动词 - HTTP 方法:GET(查询)、POST(创建)、PUT(更新)、DELETE(删除)
- 状态码:正确使用 HTTP 状态码(200、201、400、404、500)
- 版本控制:大型 API 应该使用版本号,如
/v1/users - 文档完善:利用 FastAPI 自动生成文档,保持文档和代码同步
上一周: Python 实战
Day 14 | 第二阶段复盘
下一天: 数据验证
Day 16 | Pydantic 数据验证