(六)Blueprint、端点名称与 url_for
账号和书籍各有多条路由,可以先分别登记,再统一加入应用。Blueprint 保存这一组登记操作。
# 项目文件:demos/blueprint_demo.py
from flask import Blueprint, Flask, url_for
bp = Blueprint("books", __name__, url_prefix="/books")
@bp.get("/<int:book_id>")
def detail(book_id):
return {"id": book_id}
app = Flask(__name__)
app.register_blueprint(bp)
with app.test_request_context():
# 端点是 blueprint名.函数名,编号用于填入路径。
print(url_for("books.detail", book_id=3))
print(app.test_client().get("/books/3").json)Blueprint("books", __name__, url_prefix="/books") 给这组功能起名 books,同时加路径前缀。app.register_blueprint(bp) 才把它加入具体应用。Blueprint 本身不是另一台服务器,仍由同一个 Flask 应用处理请求。
端点名称是反向生成 URL 的查找键。这里函数名为 detail,所属 Blueprint 为 books,所以 url_for("books.detail", book_id=3) 得到 /books/3。改动路径之后,模板仍然可以按端点生成地址。url_for("static", filename="style.css") 则生成静态资源地址。
完整书架使用 auth、shelf、api 三个 Blueprint。它们分别登记账号页面、书架页面和只读 JSON 接口;路径与端点不必同名,例如 / 的端点为 shelf.index。相关接口见 Flask Blueprint。