首页 › tutorials › Claude Code Python全栈:FastAPI从零实战

Claude Code Python全栈实战:FastAPI项目从零到部署

概述

本教程面向零基础开发者,手把手教你用 Claude Code 从空白目录开始,构建一个完整的 Python FastAPI RESTful API 项目。你将学会安装配置 Claude Code、编写项目级 CLAUDE.md、用自然语言驱动开发、管理上下文与权限、运行测试并完成部署准备。学完后,你将具备用 Claude Code 独立交付 Python 后端项目的能力。

适用人群:有基础 Python 知识但未使用过 Claude Code 的开发者、想提升编码效率的后端工程师、技术团队负责人。

前置条件

条件 说明
Python 3.11+ 推荐使用 pyenv 或 conda 管理
Node.js 18+ Claude Code 运行所需
Git 2.30+ 版本控制
Anthropic API Key 在 console.anthropic.com 获取
终端环境 macOS / Linux / WSL2 均可

第一步:安装 Claude Code

1.1 全局安装

打开终端,执行一条命令完成安装:

npm install -g @anthropic-ai/claude-code

安装完成后验证版本:

claude --version
# 预期输出:claude 1.x.x (或更高版本)

常见问题:如果遇到权限错误(EACCES),不要使用 sudo。推荐用 nvm 管理 Node.js,或执行: bash mkdir -p ~/.npm-global npm config set prefix '~/.npm-global' export PATH=~/.npm-global/bin:$PATH

1.2 认证方式

Claude Code 支持三种认证方式:

flowchart LR
    A[认证方式选择] --> B[OAuth浏览器登录]
    A --> C[API Key环境变量]
    A --> D[API Key直接输入]

    B --> B1[运行 claude 自动弹出]
    C --> C1[export ANTHROPIC_API_KEY=sk-ant-xxx]
    D --> D1[首次运行时粘贴]

    style A fill:#7c3aed,color:#fff
    style B fill:#10b981,color:#fff
    style C fill:#10b981,color:#fff
    style D fill:#10b981,color:#fff

推荐方式 — OAuth 浏览器登录(最安全,无需手动管理 Key):

claude
# 浏览器自动打开,登录 Anthropic 账户即可

备选方式 — API Key 环境变量(适合 CI/CD 或远程服务器):

export ANTHROPIC_API_KEY="sk-ant-api03-xxxxx"
claude

安全提示:永远不要将 API Key 硬编码在代码或 CLAUDE.md 中。使用 .env 文件并加入 .gitignore。

1.3 验证安装

# 查看帮助信息
claude --help

# 查看配置位置
claude config list

第二步:项目初始化

2.1 创建项目目录

mkdir taskflow-api && cd taskflow-api
git init

2.2 使用 /init 初始化 Claude Code 配置

在项目目录中启动 Claude Code:

claude

进入交互界面后,输入:

/init

/init 命令会扫描项目结构,自动生成一个 CLAUDE.md 文件。由于这是一个空项目,它会创建一个基础模板。

2.3 编写项目级 CLAUDE.md

CLAUDE.md 是 Claude Code 理解你项目的"大脑"——它定义了项目规则、技术栈、代码风格和约定。这是我们教程中最关键的配置文件。

# TaskFlow API

## 项目概述
任务管理 RESTful API,基于 Python FastAPI + SQLite 开发。

## 技术栈
- Python 3.11+
- FastAPI + Uvicorn
- SQLAlchemy 2.0 (async)
- SQLite (开发) / PostgreSQL (生产)
- Pytest + httpx (测试)

## 代码规范
- 使用 type hints,所有函数必须有参数和返回类型注解
- 遵循 PEP 8,单行最大 88 字符(Black 格式化)
- API 路由按资源分文件:routers/tasks.py, routers/users.py
- Pydantic v2 模型放在 schemas/ 目录
- 数据库模型放在 models/ 目录

## 项目结构

taskflow-api/ ├── app/ │ ├── init.py │ ├── main.py # FastAPI 入口 │ ├── database.py # 数据库连接 │ ├── models/ # SQLAlchemy 模型 │ ├── schemas/ # Pydantic 模型 │ ├── routers/ # API 路由 │ └── crud/ # 数据库操作 ├── tests/ ├── CLAUDE.md ├── pyproject.toml └── requirements.txt

## 常用命令
- 运行服务:`uvicorn app.main:app --reload`
- 运行测试:`pytest -v`
- 格式化:`black . && isort .`
- 类型检查:`mypy app/`

## 禁止事项
- 不要修改 .env 文件
- 不要运行 drop table 或删除数据库操作
- 测试使用 SQLite 内存数据库,不要依赖外部服务

将上述内容保存为 CLAUDE.md,放在项目根目录。

为什么 CLAUDE.md 如此重要?

每次会话启动时,Claude Code 自动读取 CLAUDE.md 作为系统提示的一部分。它决定了 Claude 生成代码的风格、结构和边界。一份好的 CLAUDE.md 能将"能用"的输出提升到"生产级"。

2.4 创建 .gitignore

__pycache__/
*.pyc
.env
*.db
.venv/
.pytest_cache/
.mypy_cache/
.claude/

第三步:用 Claude Code 驱动开发

3.1 理解 Claude Code 的交互模式

flowchart TB
    subgraph 交互模式
        IM[交互模式] --> PM[Plan模式]
        IM --> NM[正常模式]
        IM --> AM[Agent模式]
    end

    PM --> PM1["输入前先规划<br>/plan 切换"]
    NM --> NM1["边聊边写代码<br>默认模式"]
    AM --> AM1["自动执行多步任务<br>/goal 切换"]

    subgraph 核心操作
        S1["Shift+Tab 切换模式"]
        S2["Tab 自动补全"]
        S3["Esc 取消当前操作"]
        S4["Ctrl+C 中断生成"]
    end

    style IM fill:#7c3aed,color:#fff
    style PM fill:#3b82f6,color:#fff
    style NM fill:#10b981,color:#fff
    style AM fill:#f59e0b,color:#fff

3.2 创建项目骨架

启动 Claude Code,输入第一条开发指令:

请按照 CLAUDE.md 中定义的项目结构,初始化这个 FastAPI 项目。
包括:pyproject.toml、app/main.py、app/database.py、空的 __init__.py 文件。
使用 SQLAlchemy 2.0 async 模式 + aiosqlite。

Claude Code 会: 1. 创建目录结构 2. 生成 pyproject.toml 依赖配置 3. 编写 app/main.py 入口文件 4. 配置 app/database.py 异步数据库连接

预期生成的 app/main.py:

from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware

app = FastAPI(
    title="TaskFlow API",
    version="0.1.0",
    description="任务管理 RESTful API",
)

app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)


@app.get("/health")
async def health_check() -> dict[str, str]:
    return {"status": "ok"}

预期生成的 app/database.py:

from sqlalchemy.ext.asyncio import AsyncSession, async_sessionmaker, create_async_engine
from sqlalchemy.orm import DeclarativeBase

DATABASE_URL = "sqlite+aiosqlite:///./taskflow.db"

engine = create_async_engine(DATABASE_URL, echo=False)
async_session = async_sessionmaker(engine, expire_on_commit=False)


class Base(DeclarativeBase):
    pass


async def get_db() -> AsyncSession:
    async with async_session() as session:
        yield session

3.3 安装依赖

告诉 Claude Code:

安装项目依赖并创建虚拟环境

Claude Code 会执行:

python -m venv .venv
source .venv/bin/activate
pip install fastapi uvicorn sqlalchemy aiosqlite pydantic

或者如果你用 Poetry:

用 Poetry 初始化项目,添加 fastapi, uvicorn, sqlalchemy, aiosqlite 依赖

3.4 定义数据模型

创建 Task 数据模型和对应的 Pydantic schema。
Task 需要字段:id, title, description, status (pending/in_progress/done), 
priority (low/medium/high), created_at, updated_at。
使用 SQLAlchemy 2.0 声明式模型和 Pydantic v2。

Claude Code 会生成 app/models/task.py:

import enum
from datetime import datetime

from sqlalchemy import DateTime, Enum, String, Text, func
from sqlalchemy.orm import Mapped, mapped_column

from app.database import Base


class TaskStatus(str, enum.Enum):
    pending = "pending"
    in_progress = "in_progress"
    done = "done"


class TaskPriority(str, enum.Enum):
    low = "low"
    medium = "medium"
    high = "high"


class Task(Base):
    __tablename__ = "tasks"

    id: Mapped[int] = mapped_column(primary_key=True)
    title: Mapped[str] = mapped_column(String(200))
    description: Mapped[str | None] = mapped_column(Text, default=None)
    status: Mapped[TaskStatus] = mapped_column(
        Enum(TaskStatus), default=TaskStatus.pending
    )
    priority: Mapped[TaskPriority] = mapped_column(
        Enum(TaskPriority), default=TaskPriority.medium
    )
    created_at: Mapped[datetime] = mapped_column(
        DateTime, server_default=func.now()
    )
    updated_at: Mapped[datetime] = mapped_column(
        DateTime, server_default=func.now(), onupdate=func.now()
    )

以及 app/schemas/task.py:

from datetime import datetime

from pydantic import BaseModel, Field

from app.models.task import TaskPriority, TaskStatus


class TaskCreate(BaseModel):
    title: str = Field(..., max_length=200)
    description: str | None = None
    status: TaskStatus = TaskStatus.pending
    priority: TaskPriority = TaskPriority.medium


class TaskUpdate(BaseModel):
    title: str | None = Field(None, max_length=200)
    description: str | None = None
    status: TaskStatus | None = None
    priority: TaskPriority | None = None


class TaskResponse(BaseModel):
    id: int
    title: str
    description: str | None
    status: TaskStatus
    priority: TaskPriority
    created_at: datetime
    updated_at: datetime

    model_config = {"from_attributes": True}

3.5 实现 CRUD 操作

在 app/crud/task.py 中实现 Task 的完整 CRUD 操作。
使用 async/await,所有数据库操作都要用 async session。
包含:create_task, get_task, get_tasks (支持分页和状态过滤), 
update_task, delete_task。

Claude Code 生成的 app/crud/task.py:

from sqlalchemy import select, func
from sqlalchemy.ext.asyncio import AsyncSession

from app.models.task import Task, TaskStatus
from app.schemas.task import TaskCreate, TaskUpdate


async def create_task(db: AsyncSession, task_data: TaskCreate) -> Task:
    task = Task(**task_data.model_dump())
    db.add(task)
    await db.commit()
    await db.refresh(task)
    return task


async def get_task(db: AsyncSession, task_id: int) -> Task | None:
    return await db.get(Task, task_id)


async def get_tasks(
    db: AsyncSession,
    status: TaskStatus | None = None,
    skip: int = 0,
    limit: int = 20,
) -> tuple[list[Task], int]:
    query = select(Task)
    count_query = select(func.count()).select_from(Task)

    if status:
        query = query.where(Task.status == status)
        count_query = count_query.where(Task.status == status)

    total = (await db.execute(count_query)).scalar_one()
    result = await db.execute(
        query.order_by(Task.created_at.desc()).offset(skip).limit(limit)
    )
    return list(result.scalars().all()), total


async def update_task(
    db: AsyncSession, task_id: int, task_data: TaskUpdate
) -> Task | None:
    task = await get_task(db, task_id)
    if not task:
        return None
    for key, value in task_data.model_dump(exclude_unset=True).items():
        setattr(task, key, value)
    await db.commit()
    await db.refresh(task)
    return task


async def delete_task(db: AsyncSession, task_id: int) -> bool:
    task = await get_task(db, task_id)
    if not task:
        return False
    await db.delete(task)
    await db.commit()
    return True

3.6 创建 API 路由

创建 app/routers/tasks.py,实现完整的 RESTful API 路由。
使用 APIRouter,包含以下端点:
- POST /tasks — 创建任务
- GET /tasks — 列表(支持 ?status=pending&skip=0&limit=20)
- GET /tasks/{id} — 获取单个
- PUT /tasks/{id} — 更新
- DELETE /tasks/{id} — 删除

生成 app/routers/tasks.py:

from fastapi import APIRouter, Depends, HTTPException, Query
from sqlalchemy.ext.asyncio import AsyncSession

from app.crud import task as crud
from app.database import get_db
from app.models.task import TaskStatus
from app.schemas.task import TaskCreate, TaskResponse, TaskUpdate

router = APIRouter(prefix="/tasks", tags=["tasks"])


@router.post("/", response_model=TaskResponse, status_code=201)
async def create_task(
    task_data: TaskCreate, db: AsyncSession = Depends(get_db)
) -> TaskResponse:
    task = await crud.create_task(db, task_data)
    return task


@router.get("/", response_model=list[TaskResponse])
async def list_tasks(
    status: TaskStatus | None = None,
    skip: int = Query(0, ge=0),
    limit: int = Query(20, ge=1, le=100),
    db: AsyncSession = Depends(get_db),
) -> list[TaskResponse]:
    tasks, _ = await crud.get_tasks(db, status=status, skip=skip, limit=limit)
    return tasks


@router.get("/{task_id}", response_model=TaskResponse)
async def get_task(task_id: int, db: AsyncSession = Depends(get_db)) -> TaskResponse:
    task = await crud.get_task(db, task_id)
    if not task:
        raise HTTPException(status_code=404, detail="Task not found")
    return task


@router.put("/{task_id}", response_model=TaskResponse)
async def update_task(
    task_id: int,
    task_data: TaskUpdate,
    db: AsyncSession = Depends(get_db),
) -> TaskResponse:
    task = await crud.update_task(db, task_id, task_data)
    if not task:
        raise HTTPException(status_code=404, detail="Task not found")
    return task


@router.delete("/{task_id}", status_code=204)
async def delete_task(
    task_id: int, db: AsyncSession = Depends(get_db)
) -> None:
    deleted = await crud.delete_task(db, task_id)
    if not deleted:
        raise HTTPException(status_code=404, detail="Task not found")

别忘了在 app/main.py 中注册路由:

from app.routers import tasks

app.include_router(tasks.router)

3.7 添加数据库初始化

在 app/main.py 中添加启动事件:

from contextlib import asynccontextmanager

from app.database import Base, engine


@asynccontextmanager
async def lifespan(app):
    async with engine.begin() as conn:
        await conn.run_sync(Base.metadata.create_all)
    yield


app = FastAPI(
    title="TaskFlow API",
    version="0.1.0",
    lifespan=lifespan,
)

第四步:运行与测试

4.1 首次启动

告诉 Claude Code:

启动 FastAPI 服务,确认能正常运行

Claude Code 执行:

uvicorn app.main:app --reload

预期输出:

INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO:     Started reloader process
INFO:     Started server process
INFO:     Waiting for application startup.
INFO:     Application startup complete.

打开浏览器访问 http://127.0.0.1:8000/docs,可以看到 FastAPI 自动生成的 Swagger UI 文档。

4.2 快速验证 API

在另一个终端窗口测试:

# 创建任务
curl -X POST http://127.0.0.1:8000/tasks/ \
  -H "Content-Type: application/json" \
  -d '{"title": "学习 Claude Code", "priority": "high"}'

# 获取任务列表
curl http://127.0.0.1:8000/tasks/

# 健康检查
curl http://127.0.0.1:8000/health

4.3 编写测试

告诉 Claude Code:

在 tests/ 目录下创建完整的测试文件 test_tasks.py。
使用 pytest + httpx 的 AsyncClient,SQLite 内存数据库。
覆盖所有 CRUD 操作的 happy path 和 error case。

生成的 tests/test_tasks.py:

import pytest
import pytest_asyncio
from httpx import ASGITransport, AsyncClient
from sqlalchemy.ext.asyncio import AsyncSession, async_sessionmaker, create_async_engine

from app.database import Base, get_db
from app.main import app

TEST_DB_URL = "sqlite+aiosqlite://"

test_engine = create_async_engine(TEST_DB_URL, echo=False)
TestSession = async_sessionmaker(test_engine, expire_on_commit=False)


async def override_get_db() -> AsyncSession:
    async with TestSession() as session:
        yield session


app.dependency_overrides[get_db] = override_get_db


@pytest_asyncio.fixture(autouse=True)
async def setup_db():
    async with test_engine.begin() as conn:
        await conn.run_sync(Base.metadata.create_all)
    yield
    async with test_engine.begin() as conn:
        await conn.run_sync(Base.metadata.drop_all)


@pytest.fixture
def base_url() -> str:
    return "http://test"


@pytest.mark.asyncio
async def test_create_task(base_url: str) -> None:
    async with AsyncClient(
        transport=ASGITransport(app=app), base_url=base_url
    ) as client:
        response = await client.post(
            "/tasks/",
            json={"title": "Test task", "priority": "high"},
        )
    assert response.status_code == 201
    data = response.json()
    assert data["title"] == "Test task"
    assert data["status"] == "pending"


@pytest.mark.asyncio
async def test_list_tasks(base_url: str) -> None:
    async with AsyncClient(
        transport=ASGITransport(app=app), base_url=base_url
    ) as client:
        await client.post("/tasks/", json={"title": "Task 1"})
        await client.post("/tasks/", json={"title": "Task 2"})
        response = await client.get("/tasks/")
    assert response.status_code == 200
    assert len(response.json()) == 2


@pytest.mark.asyncio
async def test_get_task_not_found(base_url: str) -> None:
    async with AsyncClient(
        transport=ASGITransport(app=app), base_url=base_url
    ) as client:
        response = await client.get("/tasks/999")
    assert response.status_code == 404


@pytest.mark.asyncio
async def test_update_task(base_url: str) -> None:
    async with AsyncClient(
        transport=ASGITransport(app=app), base_url=base_url
    ) as client:
        create_resp = await client.post(
            "/tasks/", json={"title": "Original"}
        )
        task_id = create_resp.json()["id"]
        response = await client.put(
            f"/tasks/{task_id}",
            json={"title": "Updated", "status": "in_progress"},
        )
    assert response.status_code == 200
    assert response.json()["title"] == "Updated"


@pytest.mark.asyncio
async def test_delete_task(base_url: str) -> None:
    async with AsyncClient(
        transport=ASGITransport(app=app), base_url=base_url
    ) as client:
        create_resp = await client.post(
            "/tasks/", json={"title": "To delete"}
        )
        task_id = create_resp.json()["id"]
        response = await client.delete(f"/tasks/{task_id}")
    assert response.status_code == 204

运行测试:

pip install pytest pytest-asyncio httpx
pytest -v

预期输出:

tests/test_tasks.py::test_create_task PASSED
tests/test_tasks.py::test_list_tasks PASSED
tests/test_tasks.py::test_get_task_not_found PASSED
tests/test_tasks.py::test_update_task PASSED
tests/test_tasks.py::test_delete_task PASSED

第五步:权限管理与安全配置

5.1 理解权限系统

Claude Code 的权限系统是三层模型:

flowchart TB
    subgraph 权限层级
        L1["全局设置<br>~/.claude/settings.json"]
        L2["项目设置<br>.claude/settings.json"]
        L3["会话设置<br>/permissions 命令"]
    end

    L1 --> |"继承"| L2
    L2 --> |"覆盖"| L3

    subgraph 规则类型
        R1["allow — 自动允许"]
        R2["deny — 永远禁止"]
        R3["ask — 每次询问"]
    end

    L3 --> R1
    L3 --> R2
    L3 --> R3

    style L1 fill:#7c3aed,color:#fff
    style L2 fill:#3b82f6,color:#fff
    style L3 fill:#10b981,color:#fff

5.2 配置项目权限

创建 .claude/settings.json:

{
  "permissions": {
    "allow": [
      "Bash(python *)",
      "Bash(pytest *)",
      "Bash(uvicorn *)",
      "Bash(pip install *)",
      "Bash(black *)",
      "Bash(mypy *)",
      "Read",
      "Write",
      "Edit"
    ],
    "deny": [
      "Bash(rm -rf *)",
      "Bash(drop *)",
      "Bash(DROP *)"
    ]
  }
}

这样配置后: - Claude Code 可以自由运行 Python、pytest、pip 等开发命令 - 读取、写入、编辑文件不受限制 - 但禁止执行删除和数据库 drop 操作

提示:你也可以在会话中使用 /permissions 命令动态调整权限。


第六步:上下文管理技巧

6.1 核心概念

Claude Code 每次对话都消耗 token。随着会话变长,历史消息会占用越来越多的上下文窗口。管理好上下文是高效使用的关键。

flowchart LR
    subgraph 上下文生命周期
        S[新会话] --> G[增长阶段]
        G --> C[compact压缩]
        C --> G2[继续增长]
        G2 --> C2[再次压缩]
        C2 --> E[会话结束]
    end

    subgraph 管理命令
        CMD1["/compact — 压缩历史"]
        CMD2["/clear — 清空会话"]
        CMD3["/cost — 查看费用"]
    end

    G -.-> CMD1
    C2 -.-> CMD2

    style S fill:#10b981,color:#fff
    style C fill:#f59e0b,color:#fff
    style E fill:#ef4444,color:#fff

6.2 实用命令

命令 作用 使用场景
/compact 压缩历史消息,保留关键上下文 会话超过 30 分钟时
/compact 自定义提示 带指令压缩 "保留数据库 schema,压缩其他"
/clear 清空会话,重新开始 切换到完全不同的任务
/cost 查看 token 使用量和费用 每完成一个功能后检查
/model 切换模型 简单任务用 Haiku 省 token

6.3 最佳实践

  1. 一个功能一个会话:完成一个功能(如"实现用户认证")后,用 /compact 或开新会话
  2. 善用 /compact:它不是简单截断,而是智能总结之前的对话,保留关键决策和代码结构
  3. CLAUDE.md 越精炼越好:过长的 CLAUDE.md 会持续消耗 token,控制在 100 行以内

第七步:实战案例——完整的 TaskFlow API

7.1 项目总览

经过上述步骤,你的项目结构应该是:

taskflow-api/
├── app/
│   ├── __init__.py
│   ├── main.py
│   ├── database.py
│   ├── models/
│   │   ├── __init__.py
│   │   └── task.py
│   ├── schemas/
│   │   ├── __init__.py
│   │   └── task.py
│   ├── routers/
│   │   ├── __init__.py
│   │   └── tasks.py
│   └── crud/
│       ├── __init__.py
│       └── task.py
├── tests/
│   ├── __init__.py
│   └── test_tasks.py
├── .claude/
│   └── settings.json
├── .gitignore
├── CLAUDE.md
├── pyproject.toml
└── requirements.txt

7.2 用一条指令完成功能增强

尝试用一条自然语言指令添加新功能:

给 Task 模型添加 User 关联。一个 User 可以有多个 Task。
创建完整的 User CRUD 和路由,包含用户注册(密码用 bcrypt 哈希)。
在 Task 路由中添加按用户过滤的功能。
更新测试覆盖新功能。

Claude Code 会自动: 1. 创建 app/models/user.py 2. 创建 app/schemas/user.py 3. 创建 app/crud/user.py 4. 创建 app/routers/users.py 5. 修改 app/models/task.py 添加外键 6. 更新测试文件

这就是 Claude Code 的核心价值——你只需要描述"做什么",它负责"怎么做"。

7.3 完整开发工作流

sequenceDiagram
    participant D as 开发者
    participant CC as Claude Code
    participant FS as 文件系统
    participant T as 终端

    D->>CC: "创建 FastAPI 项目骨架"
    CC->>FS: 创建目录和文件
    CC->>D: 展示创建的文件列表

    D->>CC: "定义 Task 数据模型"
    CC->>FS: 写入 models/task.py
    CC->>FS: 写入 schemas/task.py

    D->>CC: "实现 CRUD 和路由"
    CC->>FS: 写入 crud/task.py
    CC->>FS: 写入 routers/tasks.py

    D->>CC: "运行服务验证"
    CC->>T: uvicorn app.main:app --reload
    T-->>CC: 启动成功
    CC-->>D: 服务运行在 :8000

    D->>CC: "写测试并运行"
    CC->>FS: 写入 tests/test_tasks.py
    CC->>T: pytest -v
    T-->>CC: 5 passed
    CC-->>D: 所有测试通过 ✓

    D->>CC: /compact
    CC-->>D: 上下文已压缩

    D->>CC: "添加 User 模型和认证"
    Note over CC: 在压缩后的上下文中继续开发

第八步:Plan 模式的正确使用

8.1 什么时候用 Plan 模式

当你面对复杂需求时,先切换到 Plan 模式让 Claude 规划,再切换回正常模式执行:

# 按 Shift+Tab 切换到 Plan 模式
# 或者输入:
/plan

# 然后描述需求:
我需要给 API 添加 JWT 认证。请先规划实现方案,不要写代码。

Claude Code 会输出类似这样的规划:

## JWT 认证实现方案

1. 添加依赖:python-jose[cryptography], passlib[bcrypt]
2. 创建 app/core/security.py — JWT 编解码、密码哈希
3. 创建 app/core/config.py — 配置管理(SECRET_KEY 等)
4. 创建 app/routers/auth.py — 登录端点
5. 创建 app/deps.py — get_current_user 依赖
6. 在 Task 路由中添加认证保护

预估改动文件:7 个
预估时间:10 分钟

确认方案后,切换回正常模式执行:

# 按 Shift+Tab 切换回正常模式
# 然后说:
按方案执行

8.2 Plan 模式的优势


第九步:常见问题与解决方案

问题 1:Claude Code 生成的代码不符合项目规范

原因:CLAUDE.md 不够具体或 Claude 没有读到最新的规则。

解决:

请重新阅读 CLAUDE.md,然后按照其中的代码规范重写 app/routers/tasks.py

或者直接在 .claude/settings.json 中通过 projectRules 强调关键规则。

问题 2:会话变慢或上下文溢出

原因:对话历史过长,token 消耗过大。

解决:

/compact 保留数据库模型定义和 API 路由结构,压缩其他历史

问题 3:Claude Code 频繁请求权限确认

原因:权限配置不完整。

解决:在 .claude/settings.json 的 allow 列表中添加常用的命令模式:

{
  "permissions": {
    "allow": [
      "Bash(python *)",
      "Bash(pip *)",
      "Bash(pytest *)",
      "Bash(uvicorn *)",
      "Bash(git *)",
      "Bash(ls *)",
      "Bash(cat *)",
      "Read",
      "Write",
      "Edit"
    ]
  }
}

问题 4:生成的测试依赖外部服务

原因:CLAUDE.md 中没有明确说明测试约束。

解决:在 CLAUDE.md 的"禁止事项"中添加:

- 测试必须使用 SQLite 内存数据库,不得依赖外部服务

第十步:从开发到部署准备

10.1 添加 Dockerfile

创建一个多阶段 Dockerfile,基于 python:3.11-slim。
第一阶段安装依赖,第二阶段复制代码并运行 uvicorn。
暴露 8000 端口。

生成的 Dockerfile:

FROM python:3.11-slim AS builder

WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

FROM python:3.11-slim

WORKDIR /app
COPY --from=builder /usr/local/lib/python3.11/site-packages /usr/local/lib/python3.11/site-packages
COPY . .

EXPOSE 8000
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]

10.2 添加 docker-compose.yml

创建 docker-compose.yml,包含 api 服务和 PostgreSQL 数据库服务。
添加环境变量配置。

10.3 提交代码

请帮我提交代码。提交信息要描述清楚本次创建的内容。

Claude Code 会生成规范的 commit message:

feat: init TaskFlow API with FastAPI

- Project skeleton with async SQLAlchemy + SQLite
- Task model with status and priority enums
- Full CRUD operations and RESTful routes
- Pydantic v2 schemas for request/response
- Async test suite with in-memory SQLite
- CLAUDE.md project configuration

Co-Authored-By: Claude Opus 4.6 <[email protected]>

核心工作流程总结

flowchart TB
    START[开始新项目] --> INSTALL[安装 Claude Code<br>npm i -g @anthropic-ai/claude-code]
    INSTALL --> AUTH[认证<br>OAuth / API Key]
    AUTH --> INIT[初始化项目<br>/init → CLAUDE.md]
    INIT --> CONFIG[配置权限<br>.claude/settings.json]
    CONFIG --> DEV[开发循环]

    subgraph DEV[开发循环]
        direction TB
        PLAN[Plan模式<br>规划功能] --> CODE[正常模式<br>编写代码]
        CODE --> TEST[运行测试<br>pytest -v]
        TEST --> |失败| FIX[修复问题]
        FIX --> TEST
        TEST --> |通过| COMPACT[/compact<br>压缩上下文]
        COMPACT --> |下一个功能| PLAN
    end

    DEV --> DEPLOY[部署准备<br>Dockerfile + CI]

    style START fill:#7c3aed,color:#fff
    style DEV fill:#3b82f6,color:#fff
    style DEPLOY fill:#10b981,color:#fff

高效使用的十条原则

  1. CLAUDE.md 先行:每次新建项目,第一件事就是写好 CLAUDE.md
  2. Plan → Execute:复杂功能先规划后执行
  3. 小步迭代:一次只做一个功能,做完 /compact 再做下一个
  4. 权限预设:提前配置好 allow/deny,减少交互中断
  5. 测试驱动:让 Claude Code 先写测试再写实现
  6. /compact 习惯:每完成一个功能就压缩一次上下文
  7. 明确指令:说"创建 RESTful API 路由"比"写个接口"好
  8. 善用 /cost:定期检查 token 消耗
  9. 不要反复试错:一次输出不对,换个描述方式而不是重复提问
  10. 项目根目录启动:始终在项目根目录运行 claude,确保上下文完整

训练营适用性评估

维度 评估
适合训练营类型 AI 工具实战营、Python 后端训练营、开发者效率提升营
教学时长 半天(3-4 小时),含实操练习
学员基础要求 了解 Python 基础语法,用过终端
实操占比 70% 实操 + 30% 讲解
延伸方向 可衔接"Skills 开发"、"MCP 服务器开发"、"Agent 模式"等进阶课程
硬件要求 每人一台笔记本,能联网,已安装 Node.js 18+ 和 Python 3.11+

参考来源

  1. Quickstart - Claude Code Docs — Anthropic 官方快速入门指南,涵盖安装、认证、基本使用
  2. Claude Code Tutorial for Beginners 2026 - dev.to — 社区编写的 2026 年完整入门教程
  3. Setting Up a New Claude Code Project - builder.io — 详细的项目配置指南,涵盖 CLAUDE.md、MCP、Skills
  4. Claude Code Token Optimization - Build to Launch — Token 优化策略,上下文管理技巧
  5. Claude Code Permissions - Skills Playground — 权限系统完整指南,沙箱配置

[!tip] 51学通信知识星球 星主:爱卫生(微信:gprshome201101)——公众号「51学通信」创办者,19 年通信行业运维与讲师经验,著有《GPRS网络信令实例详解》《EPC原理与实践》《5G核心网原理与实践》三本纸质书(各大电商平台有售)。 星球定位:深耕 5G 核心网、IMS、NFV/AI、云原生等 ICT 领域,主打运维岗位与信令分析。 当前规模:5200 篇主题 / 990 个回答,198 元/年。 加入福利:加入星球后请加爱卫生微信,拉您进知识星球年度陪伴与答疑群——不限量回复您的各种问题,另有群内分享。 AI 加持:51学通信知识星球已作为 skill 接入 WorkBuddy,使用 deepseek-4-flash 在海量星球帖子中精准找贴、找视频、找 FAQ 和案例,做总结、找文档和 PPT 等场景全覆盖。

51学通信知识星球海报-扫码加入