正在学习
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 变量的初始值是什么?
内存存储初始化中的 _tasks 变量是一个列表。
健康检查端点返回一个包含键 'status' 和 '___' 的字典。
create_task 端点的用途是什么?
以下哪些是代码中端点返回的有效 HTTP 状态码?
如果从 get_task 端点请求一个具有不存在的 task_id 的任务,会发生什么?
task_id 的新任务。put_task 端点允许对任务进行部分更新。
TaskPatch 模型具有 'title'、'description' 和 '___' 的可选字段。
patch_task 端点的作用是什么?
运行 FastAPI 应用程序使用哪个命令?
python app.pynpm startuvicorn app:app --reloadflask run使用 curl 创建任务需要以下哪些项?
FastAPI 应用程序的交互式文档可在 http://localhost:8000/docs 访问。
在对比表中,FastAPI 被描述为专注于"强类型和___"。
put_task 和 patch_task 端点之间有什么区别?
在使用 FastAPI 实现创建新任务时,成功创建后会返回哪个 HTTP 状态码?
以下哪些是与 TaskFlow API(在 FastAPI 中实现)交互的有效方式?(选择所有适用的)
TaskFlow 的 FastAPI 实现需要对任务创建和更新的输入数据进行手动验证。
在 FastAPI 实现中,全局变量 ___ 用于为新任务生成唯一 ID。
在 TaskFlow FastAPI 实现中,你会使用什么 HTTP 方法和端点来部分更新现有任务?
登录后解锁笔记、知识点解析、AI 问答
立即登录