FastAPI 是 Python 后端 API 开发的首选框架,配合 Claude Code, 可以把从设计到测试的全流程效率提升 3-5 倍。
项目初始化:CLAUDE.md 专项配置
markdown
# CLAUDE.md(FastAPI 项目)
## 技术栈
- 框架:FastAPI 0.115+
- 异步 ORM:SQLAlchemy 2.0 async + asyncpg
- 数据验证:Pydantic v2
- 认证:python-jose(JWT)+ passlib(密码哈希)
- 测试:pytest + httpx(AsyncClient)
- 服务器:Uvicorn + Gunicorn
## 项目结构
app/
main.py # FastAPI 应用入口
api/
v1/
endpoints/ # 路由处理函数
deps.py # 依赖注入(get_db, get_current_user)
core/
config.py # 环境变量配置(使用 pydantic-settings)
security.py # JWT 生成/验证
models/ # SQLAlchemy ORM 模型
schemas/ # Pydantic 请求/响应 Schema
services/ # 业务逻辑层(路由层不写业务逻辑)
tests/
## API 响应规范
所有接口统一响应格式:
{"code": 0, "data": ..., "message": "success"}
错误响应:{"code": 非0, "data": null, "message": "错误描述"}
## 必须遵守
- 路由层只做参数解包和调用 service,不写业务逻辑
- 数据库操作必须使用 async/await
- 敏感字段(密码等)不能出现在任何响应 schema 中从零开始:让 Claude 设计 API 结构
你:我需要构建一个任务管理 API,功能包括:
用户注册/登录(JWT)、创建/更新/删除任务、
任务状态管理(待办/进行中/完成)、按状态筛选任务
请帮我:
1. 设计 RESTful 路由列表(HTTP 方法 + 路径 + 说明)
2. 设计数据库 Schema(User 表 + Task 表)
3. 输出 Pydantic Schema 定义
Claude:
路由设计:
POST /api/v1/auth/register - 用户注册
POST /api/v1/auth/login - 登录(返回 JWT)
GET /api/v1/tasks - 获取任务列表(支持 ?status= 筛选)
POST /api/v1/tasks - 创建任务
PUT /api/v1/tasks/{id} - 更新任务
DELETE /api/v1/tasks/{id} - 删除任务
PATCH /api/v1/tasks/{id}/status - 更新任务状态
数据模型:
[输出完整的 SQLAlchemy 模型和 Pydantic Schema 代码]
核心代码示例
python
# app/main.py
from fastapi import FastAPI
from app.api.v1 import auth, tasks
from app.core.config import settings
app = FastAPI(
title="Task Manager API",
version="1.0.0",
docs_url="/api/docs", # Swagger UI
)
app.include_router(auth.router, prefix="/api/v1/auth", tags=["认证"])
app.include_router(tasks.router, prefix="/api/v1/tasks", tags=["任务"])
# app/api/v1/deps.py - 依赖注入
from fastapi import Depends, HTTPException, status
from fastapi.security import HTTPBearer
from app.core.security import verify_token
from app.database import AsyncSession, get_db
security = HTTPBearer()
async def get_current_user(
token: str = Depends(security),
db: AsyncSession = Depends(get_db),
):
payload = verify_token(token.credentials)
if not payload:
raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail="Token 无效或已过期"
)
user = await db.get(User, payload["sub"])
if not user:
raise HTTPException(status_code=404, detail="用户不存在")
return user
# app/api/v1/tasks.py - 任务路由
from fastapi import APIRouter, Depends, Query
from app.schemas.task import TaskCreate, TaskResponse, TaskStatus
from app.services.task_service import TaskService
from app.api.v1.deps import get_current_user, get_db
router = APIRouter()
@router.get("", response_model=list[TaskResponse])
async def list_tasks(
status: TaskStatus | None = Query(None, description="按状态筛选"),
current_user = Depends(get_current_user),
db = Depends(get_db),
):
return await TaskService(db).list_by_user(current_user.id, status)
@router.post("", response_model=TaskResponse, status_code=201)
async def create_task(
payload: TaskCreate,
current_user = Depends(get_current_user),
db = Depends(get_db),
):
return await TaskService(db).create(current_user.id, payload)让 Claude 写 pytest 测试
你:为 POST /api/v1/tasks 接口写完整的 pytest 测试,覆盖:
1. 正常创建任务(201)
2. 未认证请求(401)
3. 标题为空(422 验证错误)
4. 标题超过 200 字符(422 验证错误)
Claude:生成完整 httpx.AsyncClient 测试代码
# 运行测试
pytest tests/ -v --asyncio-mode=auto
常见 FastAPI 报错让 Claude 帮排查
你:Uvicorn 启动报错:
RuntimeError: Task <Task pending coro=<AsyncEngine.connect()>>
destroyed while it is pending!
这是什么原因,如何修复?
Claude:这是 SQLAlchemy async engine 没有正确关闭的问题。
在应用关闭时需要 dispose engine:
@app.on_event("shutdown")
async def shutdown():
await engine.dispose()
Docker 部署配置
dockerfile
# Dockerfile
FROM python:3.12-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt --no-cache-dir
COPY . .
CMD ["gunicorn", "app.main:app",
"--workers", "4",
"--worker-class", "uvicorn.workers.UvicornWorker",
"--bind", "0.0.0.0:8000"]# 让 Claude 根据项目自动生成 docker-compose.yml
你:帮我生成 docker-compose.yml,包含:
FastAPI 应用、PostgreSQL 16、Redis 7,
应用要等数据库健康检查通过后再启动
来源:Claude Code 官方文档 - docs.anthropic.com/en/docs/claude-code