logo

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

作者:rousong2025.09.23 11:56浏览量:0

简介:本文详细介绍了如何使用 FastAPI 快速开发一个 Web API 项目,重点实现待办事项的增删改查功能,包括路由设计、模型定义、依赖注入及分步代码实现。

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

一、FastAPI 快速开发 Web API 的核心优势

FastAPI 作为现代 Python Web 框架,凭借其高性能(基于 Starlette 和 Pydantic)、自动生成 API 文档(Swagger UI 和 ReDoc)和类型提示支持,成为开发 RESTful API 的首选工具。其核心优势在于:

  1. 开发效率:通过类型注解自动生成验证逻辑,减少重复代码。
  2. 异步支持:原生支持 async/await,适合高并发场景。
  3. 标准兼容:基于 OpenAPI 和 JSON Schema,接口规范清晰。

以待办事项(Todo)管理为例,FastAPI 可快速实现增删改查(CRUD)功能,覆盖从路由设计到数据库交互的全流程。

二、项目初始化与依赖配置

1. 环境准备

使用 pip 安装核心依赖:

  1. pip install fastapi uvicorn[standard] sqlalchemy # 基础依赖
  2. pip install python-dotenv # 环境变量管理(可选)

2. 项目结构

推荐分层架构:

  1. todo_api/
  2. ├── main.py # 入口文件
  3. ├── models.py # 数据模型
  4. ├── schemas.py # 请求/响应模型
  5. ├── crud.py # 数据库操作
  6. ├── database.py # 数据库连接
  7. └── routers/ # 路由模块
  8. └── todos.py # 待办事项路由

3. 数据库连接(以 SQLite 为例)

database.py 中配置异步数据库引擎:

  1. from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession
  2. from sqlalchemy.orm import sessionmaker
  3. DATABASE_URL = "sqlite+aiosqlite:///./todo.db"
  4. engine = create_async_engine(DATABASE_URL, echo=True)
  5. AsyncSessionLocal = sessionmaker(engine, class_=AsyncSession, expire_on_commit=False)

三、待办事项模型定义

1. SQLAlchemy 模型(models.py

  1. from sqlalchemy import Column, Integer, String, Boolean
  2. from sqlalchemy.ext.declarative import declarative_base
  3. Base = declarative_base()
  4. class Todo(Base):
  5. __tablename__ = "todos"
  6. id = Column(Integer, primary_key=True, index=True)
  7. title = Column(String, index=True)
  8. description = Column(String)
  9. completed = Column(Boolean, default=False)

2. Pydantic 模型(schemas.py

  1. from pydantic import BaseModel
  2. class TodoBase(BaseModel):
  3. title: str
  4. description: str | None = None
  5. completed: bool = False
  6. class TodoCreate(TodoBase):
  7. pass
  8. class Todo(TodoBase):
  9. id: int
  10. class Config:
  11. orm_mode = True # 支持 SQLAlchemy 模型转换

四、CRUD 操作实现(crud.py

1. 基础操作函数

  1. from sqlalchemy.ext.asyncio import AsyncSession
  2. from .models import Todo
  3. from .schemas import TodoCreate
  4. async def create_todo(db: AsyncSession, todo: TodoCreate):
  5. db_todo = Todo(**todo.dict())
  6. db.add(db_todo)
  7. await db.commit()
  8. await db.refresh(db_todo)
  9. return db_todo
  10. async def get_todo(db: AsyncSession, todo_id: int):
  11. return await db.get(Todo, todo_id)
  12. async def get_todos(db: AsyncSession, skip: int = 0, limit: int = 100):
  13. return await db.scalars(
  14. db.query(Todo).offset(skip).limit(limit).all()
  15. )
  16. async def update_todo(db: AsyncSession, todo_id: int, todo: TodoCreate):
  17. db_todo = await db.get(Todo, todo_id)
  18. if db_todo:
  19. for key, value in todo.dict().items():
  20. setattr(db_todo, key, value)
  21. await db.commit()
  22. return db_todo
  23. async def delete_todo(db: AsyncSession, todo_id: int):
  24. db_todo = await db.get(Todo, todo_id)
  25. if db_todo:
  26. await db.delete(db_todo)
  27. await db.commit()
  28. return db_todo

五、路由设计与实现(routers/todos.py

1. 依赖注入与路由组织

  1. from fastapi import APIRouter, Depends, HTTPException
  2. from sqlalchemy.ext.asyncio import AsyncSession
  3. from ..database import AsyncSessionLocal
  4. from ..crud import create_todo, get_todo, get_todos, update_todo, delete_todo
  5. from ..schemas import Todo, TodoCreate
  6. router = APIRouter()
  7. async def get_db():
  8. async with AsyncSessionLocal() as session:
  9. yield session
  10. @router.post("/", response_model=Todo)
  11. async def create_todo_item(todo: TodoCreate, db: AsyncSession = Depends(get_db)):
  12. return await create_todo(db, todo)
  13. @router.get("/{todo_id}", response_model=Todo)
  14. async def read_todo(todo_id: int, db: AsyncSession = Depends(get_db)):
  15. db_todo = await get_todo(db, todo_id)
  16. if db_todo is None:
  17. raise HTTPException(status_code=404, detail="Todo not found")
  18. return db_todo
  19. @router.get("/", response_model=list[Todo])
  20. async def read_todos(skip: int = 0, limit: int = 100, db: AsyncSession = Depends(get_db)):
  21. todos = await get_todos(db, skip=skip, limit=limit)
  22. return todos
  23. @router.put("/{todo_id}", response_model=Todo)
  24. async def update_todo_item(todo_id: int, todo: TodoCreate, db: AsyncSession = Depends(get_db)):
  25. updated_todo = await update_todo(db, todo_id, todo)
  26. if updated_todo is None:
  27. raise HTTPException(status_code=404, detail="Todo not found")
  28. return updated_todo
  29. @router.delete("/{todo_id}")
  30. async def delete_todo_item(todo_id: int, db: AsyncSession = Depends(get_db)):
  31. deleted_todo = await delete_todo(db, todo_id)
  32. if deleted_todo is None:
  33. raise HTTPException(status_code=404, detail="Todo not found")
  34. return {"message": "Todo deleted successfully"}

六、主程序集成(main.py

  1. from fastapi import FastAPI
  2. from .routers import todos
  3. app = FastAPI()
  4. app.include_router(todos.router, prefix="/todos", tags=["todos"])
  5. @app.get("/")
  6. async def read_root():
  7. return {"message": "Welcome to the Todo API"}

七、运行与测试

1. 启动服务

  1. uvicorn main:app --reload

2. 测试接口

使用 curl 或 Postman 测试:

  • 创建待办事项
    1. curl -X POST "http://127.0.0.1:8000/todos/" -H "Content-Type: application/json" -d '{"title":"Learn FastAPI","description":"Complete the tutorial"}'
  • 查询所有待办事项
    1. curl "http://127.0.0.1:8000/todos/"
  • 更新待办事项
    1. curl -X PUT "http://127.0.0.1:8000/todos/1" -H "Content-Type: application/json" -d '{"title":"Learn FastAPI","description":"Master CRUD operations","completed":true}'
  • 删除待办事项
    1. curl -X DELETE "http://127.0.0.1:8000/todos/1"

八、进阶优化建议

  1. 分页查询:在 get_todos 中实现 skiplimit 参数。
  2. 错误处理:自定义异常处理器统一返回格式。
  3. 认证授权:集成 OAuth2APIKey 保护接口。
  4. 日志记录:使用 logging 模块记录请求和操作。
  5. 部署优化:配置 Gunicorn + Uvicorn 用于生产环境。

九、总结

通过 FastAPI 实现待办事项的增删改查功能,开发者可以快速掌握以下核心技能:

  1. 路由设计:基于 RESTful 原则组织 API 端点。
  2. 依赖注入:通过 Depends 管理数据库会话。
  3. 异步编程:使用 async/await 处理 I/O 密集型操作。
  4. 数据验证:利用 Pydantic 模型自动校验请求体。

此项目可作为学习 FastAPI 的入门范例,也可扩展为完整的任务管理系统。实际开发中,可进一步集成数据库迁移工具(如 Alembic)、消息队列(如 Celery)或前端框架(如 React/Vue)构建全栈应用。

相关文章推荐

发表评论