Lab2 · 购物清单(Flask REST API)

一句话:把 Lab1 的购物清单改造成 Flask REST API + fetch 前端渲染——服务器只返回 JSON,页面由 JS 负责渲染和局部刷新,不再整页重载。 1. getseparatedshoppinglist()…

Este texto solo está disponible en chino por ahora. La interfaz ya está traducida; el contenido llegará después.

代码:CSSE280 HW\280lab2\|所属课程:CSSE280 总览|前身:Lab1 - 购物清单(Socket 手写服务器)

一句话:把 Lab1 的购物清单改造成 Flask REST API + fetch 前端渲染——服务器只返回 JSON,页面由 JS 负责渲染和局部刷新,不再整页重载。

相比 Lab1 的三大变化

Lab1Lab2
服务器socket 手写Flask(@app.get / @app.post 装饰器)
数据模型两个 list一个 dict:{"milk": {"got": False}, ...},移动 = 翻转 got 标志
渲染服务端 str.format + 整页刷新前端 fetch JSON → renderLists() 操作 DOM

API 设计

方法路由作用状态
GET/list返回整个清单 JSON✅ 已注册
POST/list/<item>添加条目(防重复),返回 201✅ 已注册
PATCH/list/<item>移动条目(翻转 got)⚠️ 前端在调,服务器没注册
DELETE/list/<item>删除条目⚠️ 前端在调,服务器没注册

⚠️ 当前的坑(跑之前要修)

  1. get_separated_shopping_list() 不存在httpserver.py 的 GET/POST 路由调用了它,但 dataservice.py 里只有 get_shopping_list() → 一访问 /listAttributeError。前端 parseListsFromResponseDataDict() 期望的就是原始 dict 格式,所以直接改调 get_shopping_list() 即可。
  2. PATCH / DELETE 路由缺失script.jsmoveItem / removeItem 会收到 405。需要补 @app.patch("/list/<item>")@app.delete("/list/<item>"),分别调 dataservice.move_item_between_lists / remove_item
  3. httpserver.py 底部的 handle_api_routes() 是 Lab1 手写路由的残留死代码(写在 app.run() 之后,永远不会被 Flask 调用),可删——但它恰好是第 2 条 PATCH/DELETE 该怎么写的参考。

前端要点(script.js)

运行

cd "CSSE280 HW\280lab2"
.venv\Scripts\activate     # venv 里装了 Flask 3.1.3
python httpserver.py
# → http://localhost:8080/shopping.html

.venv/ 是 Python 虚拟环境(Flask 及依赖),属于工具不属于知识,笔记不收录其内容。