系列:Python Web 框架
FastAPI 是一个基于 Python 类型提示的现代 Web 框架,特点是高性能、自动生成 API 文档、内置数据校验。它的核心优势:
- 快:基于 Starlette 和 Pydantic,性能与 Node.js、Go 接近
- 自动文档:自动生成 Swagger UI 和 ReDoc 交互式文档
- 类型安全:利用 Python 类型提示做参数校验和序列化
- 简洁:用少量代码就能写出完整的 REST API
适用环境
FastAPI 需要 Python 3.8 及以上版本。本文在 Linux 环境下示范,macOS 和 Windows 同样适用。
安装前确认 Python 版本:
python3 --version建议先创建虚拟环境,避免依赖冲突。以下使用 Python 内置的 venv 模块:
安装 FastAPI
创建项目目录并初始化虚拟环境:
mkdir fastapi-demo && cd fastapi-demopython3 -m venv .venvsource .venv/bin/activate激活后终端提示符前会出现 (.venv) 标识。接下来安装 FastAPI 和 ASGI 服务器:
pip install fastapi uvicorn[standard]fastapi:框架本体uvicorn[standard]:ASGI 服务器,[standard]额外安装uvloop和httptools以获得更好性能
安装完成后确认:
pip show fastapi第一个应用
创建 main.py:
from fastapi import FastAPI
app = FastAPI()
@app.get("/")def read_root(): return {"message": "Hello, FastAPI!"}启动服务:
uvicorn main:app --reloadmain:app:模块main里的app实例--reload:代码变更时自动重启,开发时使用
访问 http://127.0.0.1:8000 可以看到 JSON 响应。同时 FastAPI 自动生成了两份文档:
- Swagger UI:
http://127.0.0.1:8000/docs - ReDoc:
http://127.0.0.1:8000/redoc
在 Swagger 页面可以直接测试接口,无需额外工具。
路径参数
路径参数用于从 URL 中提取动态值:
@app.get("/users/{user_id}")def get_user(user_id: int): return {"user_id": user_id}访问 /users/42 返回 {"user_id": 42}。FastAPI 会根据类型提示自动把字符串 "42" 转为整数 42。如果访问 /users/abc,FastAPI 会返回校验错误:
{ "detail": [ { "type": "int_parsing", "loc": ["path", "user_id"], "msg": "Input should be a valid integer, unable to parse string as an integer" } ]}查询参数
路径函数中不在路径里的参数会自动成为查询参数:
from typing import Optional
@app.get("/users")def list_users(page: int = 1, size: int = 10, keyword: Optional[str] = None): return {"page": page, "size": size, "keyword": keyword}请求 /users?page=2&size=20&keyword=zhang 即可获得对应参数。FastAPI 还支持用 Query 做更细致的校验:
from fastapi import Query
@app.get("/search")def search(q: str = Query(..., min_length=2, max_length=50, description="搜索关键词")): return {"query": q}Query(...) 表示 q 是必填参数,如果缺少会返回 422 错误。
请求体与数据模型
对于 POST、PUT 等请求,使用 Pydantic 模型定义请求体:
from pydantic import BaseModel
class Item(BaseModel): name: str price: float description: str = "" tax: float | None = None
@app.post("/items")def create_item(item: Item): total = item.price + (item.tax or 0) return {"name": item.name, "total": total}FastAPI 会自动:
- 从请求体解析 JSON 并转为
Item对象 - 校验字段类型和必填项
- 在文档中展示模型结构
测试时可以用 curl:
curl -X POST http://127.0.0.1:8000/items \ -H "Content-Type: application/json" \ -d '{"name": "笔记本", "price": 15.5, "tax": 1.5}'路由拆分
项目变大时,可以用 APIRouter 把路由拆到不同模块:
routers/users.py:
from fastapi import APIRouter
router = APIRouter(prefix="/users", tags=["用户"])
@router.get("/")def list_users(): return [{"id": 1, "name": "张三"}]
@router.post("/")def create_user(name: str): return {"id": 2, "name": name}main.py 中引入:
from fastapi import FastAPIfrom routers import users
app = FastAPI()app.include_router(users.router)prefix 设置路径前缀,tags 在文档中分组显示。
CORS 配置
如果前端和后端不在同一域名,需要配置跨域:
from fastapi.middleware.cors import CORSMiddleware
app.add_middleware( CORSMiddleware, allow_origins=["http://localhost:3000"], allow_credentials=True, allow_methods=["*"], allow_headers=["*"],)开发阶段可以把 allow_origins 设为 ["*"],但生产环境应指定具体域名。
常用启动参数
uvicorn main:app --reload --host 0.0.0.0 --port 8080| 参数 | 说明 |
|---|---|
--reload | 文件变更自动重启 |
--host | 监听地址,默认 127.0.0.1 |
--port | 端口,默认 8000 |
--workers | 工作进程数(不要与 --reload 同时使用) |
--log-level | 日志级别,可选 debug/info/warning/error |
常见问题
pip 安装报找不到包
先确认虚拟环境已激活(终端提示符有 (.venv)),再升级 pip:
pip install --upgrade pippip install fastapi uvicorn[standard]如果网络慢,可以换国内镜像源:
pip install fastapi uvicorn[standard] -i https://pypi.tuna.tsinghua.edu.cn/simple端口已被占用
uvicorn 默认使用 8000 端口。如果端口被占用,指定其他端口:
uvicorn main:app --reload --port 8001修改代码后不生效
检查是否带了 --reload 参数。另外 --reload 只监听 Python 文件的变更,修改静态文件不会触发重启。
生产环境部署
生产环境不要用 --reload,应该这样启动:
uvicorn main:app --host 0.0.0.0 --port 8000 --workers 4也可以搭配 Gunicorn 管理进程:
pip install gunicorngunicorn main:app -w 4 -k uvicorn.workers.UvicornWorker -b 0.0.0.0:8000总结
FastAPI 的核心优势是用 Python 类型提示同时实现数据校验、序列化和自动文档,省去了大量样板代码。这里介绍了安装、路由、参数校验、数据模型、路由拆分和 CORS 配置,足够搭建一个功能完整的后端服务。更多内容可以参考 FastAPI 官方文档。
如果你还在比较框架选择,可以先看 Python Web 框架有哪些,怎么选;项目开始变复杂后,再继续阅读 FastAPI 进阶使用指南。