FastAPI 实战:待办事项路由的增删改查全流程指南

FastAPI 快速开发 Web API 项目:实现待办事项路由增删改查

引言

FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,基于标准 Python 类型提示。它结合了 Starlette 的速度和 Pydantic 的数据验证功能,使得开发 Web API 变得异常简单和高效。本文将详细介绍如何使用 FastAPI 快速开发一个 Web API 项目,并重点实现待办事项(Todo)路由的增删改查(CRUD)功能。

项目准备

环境搭建

首先,确保你的 Python 环境已安装(建议 Python 3.7+),然后创建一个新的虚拟环境:

  1. python -m venv venv
  2. source venv/bin/activate # 在 Windows 上使用 `venv\Scripts\activate`

安装 FastAPI 和 Uvicorn(一个 ASGI 服务器,用于运行 FastAPI 应用):

  1. pip install fastapi uvicorn

项目结构

建议的项目结构如下:

  1. todo_api/
  2. │── main.py # 主应用文件
  3. │── models.py # 数据模型
  4. │── crud.py # 数据库操作
  5. │── schemas.py # 数据验证模型
  6. │── requirements.txt # 依赖文件

实现待办事项路由的增删改查

1. 定义数据模型

models.py 中定义待办事项的数据模型:

  1. from pydantic import BaseModel
  2. class Todo(BaseModel):
  3. id: int
  4. title: str
  5. description: str
  6. completed: bool = False

2. 定义数据验证模型

schemas.py 中定义用于请求和响应的数据验证模型:

  1. from pydantic import BaseModel
  2. class TodoCreate(BaseModel):
  3. title: str
  4. description: str
  5. class TodoUpdate(BaseModel):
  6. title: str = None
  7. description: str = None
  8. completed: bool = None

3. 数据库操作(模拟)

crud.py 中实现模拟的数据库操作:

  1. from typing import List, Optional
  2. from models import Todo
  3. # 模拟数据库
  4. todos = []
  5. def create_todo(todo: TodoCreate) -> Todo:
  6. new_id = len(todos) + 1
  7. new_todo = Todo(id=new_id, **todo.dict())
  8. todos.append(new_todo)
  9. return new_todo
  10. def get_todos() -> List[Todo]:
  11. return todos
  12. def get_todo(todo_id: int) -> Optional[Todo]:
  13. for todo in todos:
  14. if todo.id == todo_id:
  15. return todo
  16. return None
  17. def update_todo(todo_id: int, todo_update: TodoUpdate) -> Optional[Todo]:
  18. todo = get_todo(todo_id)
  19. if todo:
  20. update_data = todo_update.dict(exclude_unset=True)
  21. for key, value in update_data.items():
  22. setattr(todo, key, value)
  23. return todo
  24. return None
  25. def delete_todo(todo_id: int) -> bool:
  26. global todos
  27. todos = [todo for todo in todos if todo.id != todo_id]
  28. return True

4. 实现路由

main.py 中实现待办事项的增删改查路由:

  1. from fastapi import FastAPI, HTTPException
  2. from typing import List
  3. from models import Todo
  4. from schemas import TodoCreate, TodoUpdate
  5. import crud
  6. app = FastAPI()
  7. @app.post("/todos/", response_model=Todo)
  8. def create_todo(todo: TodoCreate):
  9. return crud.create_todo(todo)
  10. @app.get("/todos/", response_model=List[Todo])
  11. def get_todos():
  12. return crud.get_todos()
  13. @app.get("/todos/{todo_id}", response_model=Todo)
  14. def get_todo(todo_id: int):
  15. todo = crud.get_todo(todo_id)
  16. if todo is None:
  17. raise HTTPException(status_code=404, detail="Todo not found")
  18. return todo
  19. @app.put("/todos/{todo_id}", response_model=Todo)
  20. def update_todo(todo_id: int, todo_update: TodoUpdate):
  21. todo = crud.update_todo(todo_id, todo_update)
  22. if todo is None:
  23. raise HTTPException(status_code=404, detail="Todo not found")
  24. return todo
  25. @app.delete("/todos/{todo_id}")
  26. def delete_todo(todo_id: int):
  27. if not crud.delete_todo(todo_id):
  28. raise HTTPException(status_code=404, detail="Todo not found")
  29. return {"message": "Todo deleted successfully"}

5. 运行应用

使用 Uvicorn 运行 FastAPI 应用:

  1. uvicorn main:app --reload

现在,你可以通过访问 http://127.0.0.1:8000/docs 来查看自动生成的 API 文档,并进行交互式测试。

深入解析

路由定义

FastAPI 使用装饰器来定义路由,如 @app.post@app.get@app.put@app.delete,分别对应 HTTP 的 POST、GET、PUT 和 DELETE 方法。每个路由函数接收请求参数,并返回响应。

数据验证

FastAPI 结合 Pydantic 进行数据验证。通过定义 TodoCreateTodoUpdate 模型,FastAPI 会自动验证请求体中的数据,并返回详细的错误信息。

依赖注入

FastAPI 支持依赖注入系统,可以简化数据库连接、认证等功能的实现。虽然本文未直接使用,但在实际项目中,依赖注入能显著提升代码的可维护性。

性能优化

FastAPI 基于 Starlette 和 Pydantic,具有高性能。对于数据库操作,可以考虑使用异步数据库驱动(如 asyncpg 与 PostgreSQL 配合 databases 库)来进一步提升性能。

实际应用建议

  1. 数据库集成:将模拟数据库替换为真实的数据库(如 PostgreSQL、MySQL 或 SQLite)。
  2. 异步支持:对于 I/O 密集型操作,使用异步数据库驱动和 FastAPI 的异步支持。
  3. 认证与授权:添加 JWT 认证或 OAuth2 支持,保护 API。
  4. 日志与监控:集成日志记录和监控工具(如 Prometheus 和 Grafana),便于问题排查和性能优化。
  5. 部署:考虑使用 Docker 容器化应用,并部署到云平台(如 AWS、GCP 或 Azure)。

结论

通过本文,你已掌握了如何使用 FastAPI 快速开发一个 Web API 项目,并实现了待办事项路由的增删改查功能。FastAPI 的高性能、易用性和强大的数据验证功能,使得它成为构建现代 Web API 的理想选择。希望本文能为你提供实用的指导和启发,助你在实际项目中高效开发。