先理解 Web、HTTP 与 API
1.1 FastAPI 用来做什么
假设你要做一个待办事项应用。页面负责显示按钮、输入框和列表;服务器负责保存任务、读取任务、判断用户是否有权限。
FastAPI 帮你编写服务器上的接口,例如:
- 获取全部任务。
- 创建一个任务。
- 把某个任务标记为已完成。
- 删除一个任务。
API 可以理解为“别人按照约定调用你程序的入口”。 调用者可以是网页、手机应用、另一个 Python 程序,也可以是其他后端服务。
FastAPI 的核心工作,是把“某种 HTTP 请求”对应到“某个 Python 函数”,并根据声明解析数据、校验数据、组织响应和生成接口文档。官方第一个应用说明
1.2 一次请求的过程
text
用户点击“查看任务”
↓
客户端发送 GET /todos/1
↓
服务器接收请求
↓
FastAPI 找到处理 GET /todos/{todo_id} 的函数
↓
解析 todo_id,执行校验,运行函数
↓
函数查询任务并返回数据
↓
客户端收到状态码和 JSON,显示到页面客户端是发起请求的一方;服务器是接收并处理请求的一方。浏览器只是客户端的一种。
1.3 URL 的组成
text
http://127.0.0.1:8000/todos/3?done=true
│ │ │ │ └─ 查询字符串
│ │ │ └───────── 路径
│ │ └────────────── 端口
│ └──────────────────────── 主机地址
└─────────────────────────────── 协议127.0.0.1 指当前电脑;8000 是服务监听的端口。路径 /todos/3 表示某个具体任务,done=true 是附加条件。
1.4 HTTP 请求中有什么
| 部分 | 作用 | 例子 |
|---|---|---|
| 方法 | 表达操作意图 | GET、POST |
| 路径 | 指定接口或资源 | /todos/3 |
| 查询参数 | 提供筛选、分页等条件 | ?skip=0&limit=10 |
| 请求头 | 提供认证、格式等信息 | Authorization、Content-Type |
| 请求体 | 携带较复杂的数据 | 新任务的标题和描述 |
请求体是请求的“正文”。创建任务通常需要正文;查询任务通常用路径和查询参数。
1.5 JSON 是什么
JSON 是一种常用的数据交换格式,长得很像 Python 字典,但二者不是同一种东西。
json
{
"title": "学习 FastAPI",
"done": false,
"description": null,
"tags": ["Python", "后端"]
}| 含义 | Python | JSON |
|---|---|---|
| 布尔真 | True | true |
| 布尔假 | False | false |
| 空值 | None | null |
| 字符串 | 单引号或双引号 | 双引号 |
| 对象 | dict | object |
| 数组 | list | array |
你在 Python 函数中通常返回字典或模型,框架再把它序列化为 JSON。序列化就是把程序中的对象转换成适合传输的形式。
1.6 四个容易混淆的角色
| 名称 | 可以怎样理解 |
|---|---|
| FastAPI | 组织接口、参数、依赖和文档的框架 |
| Starlette | FastAPI 所使用的底层 Web 工具 |
| Pydantic | 根据类型与规则解析、校验结构化数据 |
| Uvicorn | 接收网络请求并运行应用的 ASGI 服务器 |
先记住“框架负责处理规则,服务器负责接收网络请求”。ASGI 的详细协议可以以后再学。官方 ASGI 服务器说明