(十五)从身份检查走到书籍归属
知道请求来自 bob,不代表编号为 1 的书属于 bob。读取、修改和删除继续使用同一份 owned_book;列表则只查 g.user['id'] 对应的记录。
# 项目文件:shelf_project/src/shelfweb/books.py
# 列表和详情都按当前登录账户查询,避免通过记录编号读到其他账户的书籍。
from flask import (
Blueprint,
abort,
flash,
g,
redirect,
render_template,
request,
url_for,
)
from . import service
from .auth import login_required
from .validation import read_book_form
bp = Blueprint("shelf", __name__)
@bp.get("/")
@login_required
def index():
q, finished = request.args.get("q", "").strip(), request.args.get("finished", "all")
if len(q) > 100 or finished not in {"all", "0", "1"}:
abort(400, description="请检查书名与阅读状态筛选")
books = service.list_books(g.user["id"], q, finished)
return render_template("books/index.html", books=books, q=q, finished=finished)
@bp.get("/books/<int:book_id>")
@login_required
def detail(book_id):
return render_template(
"books/detail.html", book=service.owned_book(book_id, g.user["id"])
)书架首页读取查询参数,检查后交给 service.list_books,把普通字典列表传给模板。单本页面按编号取得自己的书。完整数据加载发生在业务函数中,模板只负责组织显示。
页面里只要有一个编号,例如 book_id=1,服务端都要重新判断归属。隐藏输入、链接和地址栏可以由调用者修改,不能代替数据库中保存的用户关系。