很多人只把 Flask 当 JSON API 框架,这会低估它。
Flask 原生就能做服务端渲染页面,而且体验很直接。
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:
<!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:
{% extends "base.html" %}
{% block body %}
<h1>轻骑兵街区</h1>
<p>今天共有 {{ mission_count }} 个任务待处理。</p>
{% endblock %}这里有几条很实用的判断:
- Flask 完全能做传统 SSR 网站
Jinja默认会对 HTML 模板做自动转义,安全性更稳url_for()应该成为肌肉记忆,不要硬编码路径flash()很适合做“一次请求结束后,在下一次页面显示一下反馈”- 但 flash 消息本质也走 session cookie,别塞超大内容
也就是说,Flask 不是“只能写接口的轻骑兵”。
它更准确的形象是:
既能跑哨站 API,也能直接经营街边窗口页面。