FastAPI 网络编程入门到实战:从 HTTP 协议到异步 API 开发
FastAPI 网络编程入门到实战:从 HTTP 协议到异步 API 开发
本文带你从零理解网络编程基础,掌握 FastAPI 的核心概念:路径与查询参数、类型校验、异常处理、异步编程,并最终部署一个完整的 API 服务。所有代码均可直接运行,适合想要快速上手现代 Python Web 开发的读者。
目录
- 网络编程基础:HTTP 协议与 Socket
- 1.1 HTTP 请求与响应格式
- 1.2 常见 Content-Type
- 1.3 Socket 底层原理
- FastAPI 核心组件
- 2.1 为什么选择 FastAPI?
- 2.2 路由(Routing)与装饰器
- 2.3 路径参数(Path Parameters)
- 2.4 查询参数(Query Parameters)
- 2.5 请求体与 Pydantic 模型
- 参数校验与类型注解
- 3.1 类型注解自动转换
- 3.2 使用 Query、Path 进行高级校验
- 3.3 数值范围与字符串长度约束
- 异常处理与 HTTPException
- 异步编程:async 与 await
- 5.1 Python 并发短板与协程优势
- 5.2 FastAPI 中的异步路由
- ASGI vs WSGI:新一代 Web 服务器接口
- 部署与运行:Uvicorn 的使用
- 完整实战:图书管理 API
- 总结与扩展
1. 网络编程基础:HTTP 协议与 Socket
1.1 HTTP 请求与响应格式
HTTP 协议是客户端(如浏览器)与服务器通信的统一语言。一个典型的 HTTP 请求由四部分组成:
请求行 + 请求头 + 空行 + 请求体
- 请求行:包含方法(GET/POST)、URL、协议版本。
- 请求头:键值对,如
Content-Type: application/json。 - 空行:分隔头部与体。
- 请求体:可选,常用于 POST/PUT 携带数据。
HTTP 响应同样由四部分组成:
状态行 + 响应头 + 空行 + 响应体
- 状态行:协议版本 + 状态码 + 状态描述(如
200 OK)。
1.2 常见 Content-Type
| Content-Type | 说明 |
|---|---|
text/plain |
纯文本 |
text/html |
HTML 文档 |
application/json |
JSON 数据(API 最常用) |
image/png |
PNG 图片 |
1.3 Socket 底层原理
Socket 是网络编程的基石。简单说,服务端创建一个 Socket,绑定 IP 和端口(如 0.0.0.0:8080),然后监听并接收浏览器请求,解析后返回 HTTP 响应。FastAPI 封装了这些细节,让开发者只需关注业务逻辑。
2. FastAPI 核心组件
2.1 为什么选择 FastAPI?
- 高性能:基于 Starlette(ASGI)和 Pydantic,性能接近 Node.js 和 Go。
- 自动文档:访问
/docs即可获得交互式 API 文档。 - 类型校验:利用 Python 类型注解 + Pydantic,自动验证请求数据。
- 异步支持:原生
async/await。
2.2 路由(Routing)与装饰器
路由是 URL 路径与处理函数的映射。FastAPI 使用装饰器声明:
from fastapi import FastAPI
app = FastAPI()
# 静态路由
@app.get("/books")
def get_books():
return {"books": ["三体", "活着"]}
# 动态路由(带路径参数)
@app.get("/books/{book_name}")
def get_book(book_name: str):
return {"book_name": book_name}
路由优先级:静态路由优先于动态路由(书写在上面的优先匹配)。
2.3 路径参数(Path Parameters)
路径参数是 URL 的一部分,如 /book/123 中的 123。FastAPI 自动将参数转换为指定类型,并可添加校验。
@app.get("/books/{book_id}")
def get_book_by_id(book_id: int): # 自动转为 int
return {"book_id": book_id}
2.4 查询参数(Query Parameters)
查询参数形如 /books?page=1&size=10,通过函数参数直接获取:
@app.get("/books")
def list_books(page: int = 1, size: int = 3):
return {"page": page, "size": size}
2.5 请求体与 Pydantic 模型
对于 POST/PUT 请求,使用 Pydantic 模型定义请求体结构:
from pydantic import BaseModel
class Book(BaseModel):
title: str
author: str
price: float
@app.post("/books")
def create_book(book: Book):
return {"msg": f"已添加图书《{book.title}》"}
3. 参数校验与类型注解
3.1 类型注解自动转换
FastAPI 根据类型注解自动转换参数(如 int、float、bool),若转换失败则返回清晰的错误。
3.2 使用 Query、Path 进行高级校验
通过 Query 和 Path 可以添加校验规则:
from fastapi import Query, Path
@app.get("/books")
def list_books(
page: int = Query(default=1, ge=1, description="页码,从1开始"),
size: int = Query(default=3, ge=1, le=100)
):
return {"page": page, "size": size}
@app.get("/books/{book_id}")
def get_book(
book_id: int = Path(ge=1, le=10000, description="图书ID,范围1-10000")
):
return {"book_id": book_id}
3.3 数值范围与字符串长度约束
| 校验参数 | 适用类型 | 说明 |
|---|---|---|
ge |
数值 | 大于等于 |
le |
数值 | 小于等于 |
min_length |
字符串 | 最小长度 |
max_length |
字符串 | 最大长度 |
regex |
字符串 | 正则匹配 |
from fastapi import Query
@app.get("/search")
def search(
q: str = Query(min_length=1, max_length=50, regex="^[a-zA-Z0-9]+$")
):
return {"query": q}
4. 异常处理与 HTTPException
FastAPI 提供 HTTPException 统一返回错误响应,并自动包含状态码和详细信息。
from fastapi import HTTPException
@app.get("/books/{book_id}")
def get_book(book_id: int):
if book_id not in [1, 2, 3]:
raise HTTPException(status_code=404, detail="查无此书")
return {"book_id": book_id}
你也可以自定义异常处理器,但 HTTPException 已满足绝大多数场景。
5. 异步编程:async 与 await
5.1 Python 并发短板与协程优势
Python 有 GIL(全局解释器锁),多线程无法充分利用 CPU。但对于 I/O 密集型任务(如数据库查询、HTTP 请求),协程异步能极大提升并发能力。async/await 允许在等待 I/O 时切换执行其他任务,而非阻塞线程。
5.2 FastAPI 中的异步路由
只需将路由函数定义为 async def,并在需要等待异步操作时使用 await。
import asyncio
@app.get("/async-example")
async def async_route():
await asyncio.sleep(1) # 模拟异步 I/O
return {"msg": "异步执行完成"}
注意:如果路由内没有真正的异步操作(如只做简单计算),用普通
def即可,FastAPI 会自动在线程池中执行。
6. ASGI vs WSGI:新一代 Web 服务器接口
| 特性 | WSGI | ASGI |
|---|---|---|
| 全称 | Web Server Gateway Interface | Asynchronous Server Gateway Interface |
| 同步/异步 | 同步 | 原生异步 |
| 支持协议 | HTTP | HTTP、WebSocket、HTTP/2 |
| 代表框架 | Django、Flask | FastAPI、Starlette、Quart |
| 并发模型 | 多进程/多线程 | 协程(单线程高并发) |
ASGI 的出现正是为了应对现代 Web 需求:WebSocket 长连接、高并发 I/O。FastAPI 基于 Starlette(ASGI 框架),天然支持异步。
7. 部署与运行:Uvicorn 的使用
Uvicorn 是专为 ASGI 设计的轻量级服务器,类似 Flask 的 Werkzeug。
7.1 安装
pip install fastapi uvicorn
7.2 运行
假设代码保存在 main.py,且 app 变量为 FastAPI() 实例。
# 命令行方式
uvicorn main:app --reload --host 0.0.0.0 --port 8000
# 或在代码中启动
if __name__ == "__main__":
import uvicorn
uvicorn.run("main:app", host="0.0.0.0", port=8000, reload=True)
--reload:开发模式,代码改动自动重启。--host 0.0.0.0:允许外部访问。- 访问
http://localhost:8000/docs查看自动生成的交互式文档。
8. 完整实战:图书管理 API
下面实现一个完整的图书管理 API,包含增删改查、路径参数、查询参数、请求体校验和异常处理。
from fastapi import FastAPI, HTTPException, Query, Path
from pydantic import BaseModel, Field
from typing import List, Optional
app = FastAPI(title="图书管理API", description="演示FastAPI各项功能")
# 数据模型
class BookCreate(BaseModel):
title: str = Field(..., min_length=1, max_length=50)
author: str = Field(..., min_length=1)
price: float = Field(..., ge=0, le=9999)
class BookResponse(BookCreate):
id: int
# 模拟数据库
fake_db = []
book_id_counter = 1
@app.post("/books", status_code=201)
async def create_book(book: BookCreate):
global book_id_counter
new_book = BookResponse(id=book_id_counter, **book.dict())
fake_db.append(new_book)
book_id_counter += 1
return new_book
@app.get("/books")
async def list_books(
skip: int = Query(0, ge=0),
limit: int = Query(10, ge=1, le=100)
) -> List[BookResponse]:
return fake_db[skip: skip + limit]
@app.get("/books/{book_id}")
async def get_book(
book_id: int = Path(..., ge=1)
) -> BookResponse:
for book in fake_db:
if book.id == book_id:
return book
raise HTTPException(status_code=404, detail="查无此书")
@app.put("/books/{book_id}")
async def update_book(book_id: int, book: BookCreate):
for idx, b in enumerate(fake_db):
if b.id == book_id:
updated = BookResponse(id=book_id, **book.dict())
fake_db[idx] = updated
return updated
raise HTTPException(status_code=404, detail="查无此书")
@app.delete("/books/{book_id}")
async def delete_book(book_id: int):
for idx, b in enumerate(fake_db):
if b.id == book_id:
fake_db.pop(idx)
return {"msg": "删除成功"}
raise HTTPException(status_code=404, detail="查无此书")
启动服务后,访问 /docs 即可测试所有接口。
9. 总结与扩展
本文从 HTTP 协议基础出发,系统介绍了 FastAPI 的核心特性:
- 路由:静态/动态路由,优先级规则。
- 参数:路径参数(
Path)、查询参数(Query)、请求体(Pydantic)。 - 校验:类型注解 +
ge/le/min_length等约束。 - 异常:
HTTPException统一错误响应。 - 异步:
async/await提升 I/O 并发能力。 - 部署:Uvicorn ASGI 服务器。
下一步学习建议:
- 数据库集成(SQLAlchemy + 异步驱动)
- 依赖注入(
Depends) - WebSocket 实时通信
- 中间件与 CORS 配置
- 单元测试(
TestClient)
FastAPI 已成为 Python Web 领域的明星框架,掌握它将极大提升你的 API 开发效率。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)