一、FastAPI 简介与项目初始化
FastAPI 是一个基于 Python 的现代 Web 框架,用于快速构建 API。它利用 Python 类型注解实现自动文档生成(Swagger UI 和 ReDoc),并支持异步请求处理,性能接近 Node.js 和 Go。相比 Flask 和 Django,FastAPI 更轻量且适合 API 开发。
1.1 环境准备
首先,确保已安装 Python 3.7+ 和 pip。创建虚拟环境并安装 FastAPI 和 Uvicorn(ASGI 服务器):
python -m venv venvsource venv/bin/activate # Linux/macOSvenv\Scripts\activate # Windowspip install fastapi uvicorn
1.2 项目结构
推荐结构如下:
todo_api/├── main.py # 入口文件├── models.py # 数据模型├── schemas.py # 请求/响应模型(Pydantic)├── crud.py # 数据库操作└── requirements.txt # 依赖文件
二、定义数据模型与 Pydantic 模式
2.1 数据模型(models.py)
使用 SQLModel(结合 SQLAlchemy 和 Pydantic)定义待办事项模型:
from sqlmodel import SQLModel, Fieldfrom typing import Optionalclass Todo(SQLModel, table=True):id: Optional[int] = Field(default=None, primary_key=True)title: str = Field(max_length=100)description: Optional[str] = Field(default=None)completed: bool = Field(default=False)
2.2 请求/响应模式(schemas.py)
使用 Pydantic 定义数据验证模式:
from pydantic import BaseModelfrom typing import Optionalclass TodoBase(BaseModel):title: strdescription: Optional[str] = Nonecompleted: bool = Falseclass TodoCreate(TodoBase):passclass TodoUpdate(TodoBase):passclass Todo(TodoBase):id: intclass Config:orm_mode = True # 支持 SQLModel 对象转换
三、实现 CRUD 操作(crud.py)
3.1 数据库连接与初始化
使用 sqlmodel.Session 管理数据库会话:
from sqlmodel import SQLModel, create_engine, Sessionfrom typing import Optionalfrom .models import Todo# SQLite 内存数据库(生产环境替换为 PostgreSQL/MySQL)engine = create_engine("sqlite:///todos.db")def init_db():SQLModel.metadata.create_all(engine)
3.2 核心 CRUD 函数
def get_todos(session: Session):return session.query(Todo).all()def get_todo(session: Session, todo_id: int):return session.query(Todo).filter(Todo.id == todo_id).first()def create_todo(session: Session, todo: TodoCreate):db_todo = Todo.from_orm(todo)session.add(db_todo)session.commit()session.refresh(db_todo)return db_tododef update_todo(session: Session, todo_id: int, todo: TodoUpdate):db_todo = session.query(Todo).filter(Todo.id == todo_id).first()if db_todo:todo_data = todo.dict(exclude_unset=True)for key, value in todo_data.items():setattr(db_todo, key, value)session.commit()return db_tododef delete_todo(session: Session, todo_id: int):db_todo = session.query(Todo).filter(Todo.id == todo_id).first()if db_todo:session.delete(db_todo)session.commit()return db_todo is not None
四、构建 FastAPI 路由
4.1 初始化 FastAPI 应用
在 main.py 中:
from fastapi import FastAPI, Depends, HTTPExceptionfrom sqlmodel import Sessionfrom .crud import init_db, get_todos, get_todo, create_todo, update_todo, delete_todofrom .models import Todofrom .schemas import TodoCreate, TodoUpdatefrom .database import SessionLocal # 需在 database.py 中定义app = FastAPI()# 依赖项:获取数据库会话def get_db():with SessionLocal() as session:yield session@app.on_event("startup")async def startup():init_db()
4.2 实现增删改查路由
# 创建待办事项@app.post("/todos/", response_model=Todo)def create_todo_route(todo: TodoCreate, db: Session = Depends(get_db)):return create_todo(db, todo)# 获取所有待办事项@app.get("/todos/", response_model=list[Todo])def read_todos(db: Session = Depends(get_db)):return get_todos(db)# 获取单个待办事项@app.get("/todos/{todo_id}", response_model=Todo)def read_todo(todo_id: int, db: Session = Depends(get_db)):db_todo = get_todo(db, todo_id)if db_todo is None:raise HTTPException(status_code=404, detail="Todo not found")return db_todo# 更新待办事项@app.put("/todos/{todo_id}", response_model=Todo)def update_todo_route(todo_id: int, todo: TodoUpdate, db: Session = Depends(get_db)):db_todo = update_todo(db, todo_id, todo)if db_todo is None:raise HTTPException(status_code=404, detail="Todo not found")return db_todo# 删除待办事项@app.delete("/todos/{todo_id}")def delete_todo_route(todo_id: int, db: Session = Depends(get_db)):success = delete_todo(db, todo_id)if not success:raise HTTPException(status_code=404, detail="Todo not found")return {"message": "Todo deleted successfully"}
五、运行与测试 API
5.1 启动服务
uvicorn main:app --reload
服务默认运行在 http://127.0.0.1:8000。
5.2 测试 API
使用 curl 或 HTTPie 测试:
-
创建待办事项:
curl -X POST "http://127.0.0.1:8000/todos/" -H "Content-Type: application/json" -d '{"title": "Learn FastAPI", "description": "Build a TODO API"}'
-
获取所有待办事项:
curl "http://127.0.0.1:8000/todos/"
-
更新待办事项:
curl -X PUT "http://127.0.0.1:8000/todos/1" -H "Content-Type: application/json" -d '{"title": "Learn FastAPI", "completed": true}'
-
删除待办事项:
curl -X DELETE "http://127.0.0.1:8000/todos/1"
5.3 自动生成的文档
访问 http://127.0.0.1:8000/docs(Swagger UI)或 http://127.0.0.1:8000/redoc(ReDoc)查看交互式文档。
六、进阶优化建议
- 数据库持久化:替换 SQLite 为 PostgreSQL/MySQL,并配置连接池。
- 异步支持:使用
SQLModel的异步版本(需asyncpg)。 - 认证与授权:集成 JWT 或 OAuth2。
- 分页与过滤:在
get_todos中添加分页参数(如skip、limit)。 - 单元测试:使用
pytest编写测试用例。
七、总结
通过本文,您已掌握如何使用 FastAPI 快速开发一个完整的待办事项 Web API,包括:
- 项目初始化与环境配置。
- 数据模型与 Pydantic 模式定义。
- 核心 CRUD 操作实现。
- 路由设计与依赖注入。
- 服务运行与 API 测试。
FastAPI 的高性能和自动文档特性使其成为构建现代 Web API 的理想选择。