本节摘要:Flask 是 Python 世界最轻量的 Web 框架,核心只有一张"路由表":哪个网址对应哪个函数。本节先花三分钟讲清"为什么入门选 Flask",然后动手写出轻记账的 Web 版雏形:一个显示账目的首页、一个接收表单的记账接口。Ledger 类原封不动地担任业务核心——前三章的工程化在此兑现回报。
阅读完本节,你应当能够:
同一批人做的两个框架,性格相反。Django 是全家桶:自带后台管理、用户系统、数据库层、表单系统,开箱即给一整套,代价是先学完它的一套规矩才能动手。Flask 是积木:核心只管路由和请求响应,数据库、登录全靠你自己选件拼装,代价是初期要自己拿主意。选型的尺子还是 2.3 节那把:覆盖、成熟度、传染性。本书选 Flask,理由有三——概念面小,每个零件看得见摸得着,适合建立"框架不是魔法"的正确直觉;轻记账体量小,用不着全家桶;第五章会自己动手集成 SQLAlchemy,亲手拼一次才知道全家桶帮你省的是什么。Django 没有缺席,第 5 章末有一整节速览它。

装过 flask(2.4 的环境里已备好),应用本体短得让人不敢相信:
from flask import Flask app = Flask(__name__) @app.route("/") def index(): return "轻记账已上线,浏览器里见到我了。" # 开发服务器启动方式(终端命令,非代码): # flask --app main run --debug
@app.route("/") 是装饰器,作用是登记路由:把这个函数挂到根路径上。运行后浏览器访问本机的 5000 端口,就能看到返回的字符串。--debug 打开调试模式:改代码自动重启、报错显示完整回溯——开发期务必开着,上线后必须关掉(第 6 章安全节会讲为什么)。
给首页配上真数据,再加记账接口:
from flask import Flask, request, redirect from ledger import Ledger # 第三章写好的类,原样复用 app = Flask(__name__) ledger = Ledger() @app.route("/") def index(): lines = [] for record in ledger.all(): lines.append(f"<li>{record['item']} {record['amount']} 元</li>") total = sum(r["amount"] for r in ledger.all()) return f"<h1>本月支出合计 {total:.1f} 元</h1><ul>{''.join(lines)}</ul>" @app.route("/records", methods=["POST"]) def add_record(): item = request.form.get("item", "").strip() amount = request.form.get("amount", type=float) if not item or not amount or amount <= 0: return "用途或金额不合法", 400 ledger.add_record(item, amount) return redirect("/") # 记完跳回首页
四个新面孔逐一过:methods=["POST"] 声明这个路由只收 POST——4.1 的"改数据不用 GET"落地;request.form 是表单数据的字典视图,get 方式取值给默认值,用户没填也不崩;redirect("/") 返回一个重定向响应,浏览器收到 302 立刻请求首页;返回元组的第二个元素 400 直接指定状态码——"你提交的数据不对",4.1 节的状态码知识再次兑现。
现在建一个静态 HTML 测试页(内容用 4.2 的表单,action 指向 records),打开两个窗口:一个开着表单页,一个开着首页。提交一笔账,切到首页刷新——终端程序里的账目出现在了网页上。v0.5 到此成形。
试着不加重定向直接返回文字:记账成功后按下 F5,浏览器会提示"重新提交表单?"——因为刷新重放了上一次的 POST,同一笔账会被记两遍。重定向把"POST 响应"换成"302 跳转首页",刷新时浏览器重放的是无害的 GET。这是 Web 开发经典的"提交后重定向"模式,第 6 章前后端分离后它以另一副面孔出现,此处先建立条件反射。
变式一:加路由 /records/clear(POST)清空账目,记得先想清楚这算不算该有的功能——生产系统里"一键清空"必须三思。变式二:把 4.2 的静态表单页改造成由 Flask 返回的页面,表单提交后自动跳回。你会发现 Python 字符串拼 HTML 又丑又容易错——这正是下一节模板引擎存在的理由。
页面能用但仍靠字符串拼 HTML,又丑又脆。下一节请出模板引擎,让数据与页面体面地合体。