正在学习

7.1 概述与目标

内存存储

_next_id: int = 1 _tasks: Dict[int, Task] = {}

@app.get("/health") def health() -> Dict[str, str]: return {"status": "ok", "service": "taskflow-fastapi"}

@app.post("/tasks", response_model=Task, status_code=201) def create_task(payload: TaskCreate) -> Task: global _next_id task = Task(id=_next_id, **payload.model_dump()) _tasks[task.id] = task _next_id += 1 return task

@app.get("/tasks", response_model=List[Task]) def list_tasks() -> List[Task]: return list(_tasks.values())

@app.get("/tasks/{task_id}", response_model=Task) def get_task(task_id: int) -> Task: task = _tasks.get(task_id) if not task: raise HTTPException(status_code=404, detail="not found") return task

@app.put("/tasks/{task_id}", response_model=Task) def put_task(task_id: int, payload: TaskCreate) -> Task: if task_id not in _tasks: raise HTTPException(status_code=404, detail="not found") updated = Task(id=task_id, **payload.model_dump()) _tasks[task_id] = updated return updated

class TaskPatch(BaseModel): title: Optional[str] = Field(default=None) description: Optional[str] = None completed: Optional[bool] = None

@app.patch("/tasks/{task_id}", response_model=Task) def patch_task(task_id: int, payload: TaskPatch) -> Task: current = _tasks.get(task_id) if not current: raise HTTPException(status_code=404, detail="not found") data = current.model_dump() patch = payload.model_dump(exclude_unset=True) if "title" in patch: if not patch["title"] or not isinstance(patch["title"], str): raise HTTPException(status_code=400, detail="title must be non-empty string") data["title"] = patch["title"] if "description" in patch: data["description"] = patch["description"] if "completed" in patch: data["completed"] = bool(patch["completed"]) updated = Task(**data) _tasks[task_id] = updated return updated

@app.delete("/tasks/{task_id}", status_code=204) def delete_task(task_id: int) -> None: if task_id not in _tasks: raise HTTPException(status_code=404, detail="not found") del _tasks[task_id]


运行它

```bash
python -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -r requirements.txt
uvicorn app:app --reload

访问 http://localhost:8000/health。创建一个任务:

curl -s -X POST http://localhost:8000/tasks \
-H "Content-Type: application/json" \
-d '{"title":"First task","description":"Try Claude prompts"}'

http://localhost:8000/docs 浏览交互式文档。

对照表:选择你的入门框架

标准 Express (Node.js) FastAPI (Python)
学习曲线 非常小,抽象极少 较小;强类型与模式优先
内置验证 手动或第三方库 Pydantic 模型,自动验证
文档生成 外部工具 自动生成 OpenAPI 和 Swagger UI
典型用途 JS/TS 团队、微服务、轻量级 API Python 团队、数据/机器学习 API、模式优先设计
启动命令 npm install 然后 npm run start pip install -r requirements.txt 然后 uvicorn app:app --reload

现在你已经拥有了一个最小但具备生产形态的 API 骨架,使用你选择的框架。这为 Claude 提供了一个具体的上下文,使其能够围绕路由、验证和行为进行推理。在下一节中,你将与 Claude 协作来规划端点和数据模型,把这个入门项目转变为一个具备完整文档、一致模式、测试和防护机制的服务。

练习题

在内存存储初始化中,_next_id 变量的初始值是什么?

A. 0
B. 1
C. -1
D. None

内存存储初始化中的 _tasks 变量是一个列表。

健康检查端点返回一个包含键 'status' 和 '___' 的字典。

create_task 端点的用途是什么?

以下哪些是代码中端点返回的有效 HTTP 状态码?

A. 200
B. 201
C. 400
D. 500
E. 204

如果从 get_task 端点请求一个具有不存在的 task_id 的任务,会发生什么?

A. 它返回一个空字典。
B. 它返回一个具有默认值的任务。
C. 它引发一个状态码为 404 的 HTTPException。
D. 它创建一个具有给定 task_id 的新任务。

put_task 端点允许对任务进行部分更新。

TaskPatch 模型具有 'title'、'description' 和 '___' 的可选字段。

patch_task 端点的作用是什么?

运行 FastAPI 应用程序使用哪个命令?

A. python app.py
B. npm start
C. uvicorn app:app --reload
D. flask run

使用 curl 创建任务需要以下哪些项?

A. 端点 URL
B. HTTP 方法
C. Content-Type 头
D. JSON 格式的任务负载
E. 身份验证令牌

在对比表中,FastAPI 被描述为专注于"强类型和___"。

put_taskpatch_task 端点之间有什么区别?

在使用 FastAPI 实现创建新任务时,成功创建后会返回哪个 HTTP 状态码?

A. 200 OK
B. 201 Created
C. 204 No Content
D. 400 Bad Request

以下哪些是与 TaskFlow API(在 FastAPI 中实现)交互的有效方式?(选择所有适用的)

A. 在终端中使用 curl 命令
B. 通过交互式 Swagger UI 文档
C. 通过直接访问内存字典
D. 通过向已定义端点发送 HTTP 请求

TaskFlow 的 FastAPI 实现需要对任务创建和更新的输入数据进行手动验证。

在 FastAPI 实现中,全局变量 ___ 用于为新任务生成唯一 ID。

在 TaskFlow FastAPI 实现中,你会使用什么 HTTP 方法和端点来部分更新现有任务?

登录后解锁笔记、知识点解析、AI 问答

立即登录