Python 现代开发学习笔记

(十五)从身份检查走到书籍归属

知道请求来自 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,把普通字典列表传给模板。单本页面按编号取得自己的书。完整数据加载发生在业务函数中,模板只负责组织显示。

alice 和 bob 各自登录恢复用户编号,列表先限定 owner_id,访问同一书籍编号时继续比较归属,bob 的修改或删除在 SQL 写入之前被拒绝

页面里只要有一个编号,例如 book_id=1,服务端都要重新判断归属。隐藏输入、链接和地址栏可以由调用者修改,不能代替数据库中保存的用户关系。

笔记正文与全部题解 · Ctrl / ⌘ K