全书目录

第二十九篇:Flask 完全指南 —— 轻骑兵微服务街区宇宙

第七章:模板和静态文件 —— Flask 不只是 API,它也能经营完整街面

1 分钟 324 字 第 524 / 962 个阅读单元

很多人只把 Flask 当 JSON API 框架,这会低估它。

Flask 原生就能做服务端渲染页面,而且体验很直接。

py
from flask import Flask, render_template, url_for, flash, redirect

app = Flask(__name__)
app.config["SECRET_KEY"] = "dev-only"

@app.get("/")
def home():
    return render_template("home.html", title="轻骑兵街区")

@app.post("/missions/<int:mission_id>/approve")
def approve_mission(mission_id: int):
    flash(f"任务 {mission_id} 已批准")
    return redirect(url_for("home"))

templates/base.html

html
<!doctype html>
<html lang="zh-Hans">
  <head>
    <meta charset="utf-8">
    <title>{{ title or "轻骑兵街区" }}</title>
    <link rel="stylesheet" href="{{ url_for('static', filename='app.css') }}">
  </head>
  <body>
    {% for message in get_flashed_messages() %}
      <div class="flash">{{ message }}</div>
    {% endfor %}

    {% block body %}{% endblock %}
  </body>
</html>

templates/home.html

html
{% extends "base.html" %}

{% block body %}
  <h1>轻骑兵街区</h1>
  <p>今天共有 {{ mission_count }} 个任务待处理。</p>
{% endblock %}

这里有几条很实用的判断:

  • Flask 完全能做传统 SSR 网站
  • Jinja 默认会对 HTML 模板做自动转义,安全性更稳
  • url_for() 应该成为肌肉记忆,不要硬编码路径
  • flash() 很适合做“一次请求结束后,在下一次页面显示一下反馈”
  • 但 flash 消息本质也走 session cookie,别塞超大内容

也就是说,Flask 不是“只能写接口的轻骑兵”。

它更准确的形象是:

既能跑哨站 API,也能直接经营街边窗口页面。