🧪 第0章 Flask 的概要与环境架设
📄 一句话概括

教材拿四个 Python 网页框架并排比,结论不是「谁最好」,是「谁适合什么活」。 Django 全给你,Bottle 一个文件,FastAPI 为 API 而生,Flask 站在中间。 判断标准只有一条:它替你决定多少,以及这些决定你改不改得动。

📝 本章和前面几章的关系

这一篇几乎没有代码,是全书唯一一次「选型」讨论,但它决定了你后面读每一章的心态: Flask 里很多「没有」,不是残缺,是设计。 上一篇讲了 Flask 的四件事,这一篇讲它为什么是这四件而不是四十件。

一、Django:全都替你决定

教材给的定位很准:Django 是「 batteries included 」,电池全带上。 一条 django-admin startproject 之后,目录里自动长出 settings、urls、wsgi、 admin 四个文件——你还没写一行代码,结构已经定了。 它自带 ORM、自带后台管理、自带模板、自带表单、自带用户系统。

适合「表单多、后台多、要快速上线」的项目,比如内部管理系统、内容网站。 代价是你得按它的规矩来,改起来费劲。

二、Bottle:一个文件就是一个应用

Bottle 全部代码在一个文件里,不依赖任何第三方库,pip install 都不用, 下载一个 bottle.py 放进目录就能跑。 教材提它是为了做个极端对照:如果连 Flask 都嫌重,那还有更轻的。 它的适用场景很窄:教学演示、临时脚本、嵌入式的小接口。真做项目,路由分组、数据库、 模板这些迟早要自己补回来。

三、FastAPI:为 API 而生

FastAPI 的装饰器和 Flask 长得几乎一样,但它多了一件事:参数要标类型,标注就是校验规则。 item_id: int 不是注释,传个 abc 进去它会自动回 422 并说明哪个字段错了。 它还自动生成 OpenAPI 文档,一个 /docs 页面就能试所有接口。

所以「只做 API、前后端分离」的项目,FastAPI 比 Flask 省事得多。但要做服务端渲染的网页, 它的优势就用不上了。

四、Flask 站在中间

教材的选择很清楚:这本书既要写网页(模板渲染),又要写 API(第 12 到 17 章), 还要能自由挑数据库和登录方案。 这种「两样都要、还不想被绑死」的需求,正好落在 Flask 的位置上。 它的取舍是:把「选」的权利留给你,把「配」的麻烦也一起留给你。

所以这本书里到处是「装一个插件、注册一个蓝图、写一个配置」——那不是在绕路, 那就是 Flask 的正常用法。

五、四个框架并排看

框架 模板 数据库 后台 最适合
Django 自带 自带 ORM 自带 表单多、要快上线的网站
Flask 自己选 自己选 自己装 要自由、网页与 API 都要
Bottle 单文件 无 无 演示、临时代码
FastAPI 自己选 自己选 自动文档 纯 API、类型校验重

表格里没有「性能」这一列,因为在这个量级上, 性能从来不是选型的第一因素——开发速度和后期改动的成本才是。 真要谈性能,四个框架前端都该挂 Nginx 或反向代理,瓶颈往往在数据库和序列化上,不在框架本身。

六、动手 Demo:四个框架,差别在替你决定多少

这一节没法把四个框架都跑一遍——Django 和 FastAPI 本沙箱没装,也不打算装。 但「重不重」这件事可以量:导入一个库,看它多拉进来多少模块。

import subprocess, sys

for name in ("flask", "jinja2", "sqlalchemy", "pandas", "sklearn"):
    code = "import sys, %s; print(len(sys.modules))" % name
    out = subprocess.run([sys.executable, "-c", code],
                         capture_output=True, text=True).stdout
    print(name, int(out))

实跑输出:

--------------------------------------------------------------------
四个框架,差别在替你决定多少
--------------------------------------------------------------------
  教材把 Django、Bottle、FastAPI 摆在一起比。表里的定位是教材的说法,成本那一列是这次真量的:

| 导入的那个库 | 多带进来的模块数 | 导入耗时(毫秒) |
|---|---:|---:|
| flask | 206 | 993 |
| jinja2 | 52 | 328 |
| sqlalchemy | 186 | 1117 |
| pandas | 488 | 1515 |
| sklearn | 1323 | 4337 |

  量法:同一个子进程跑三遍取最快。
  模块数减掉裸解释器本来的 106 个,耗时减掉「什么都不 import」的 439 毫秒。
  ! 但这台机器起一次进程本身就要 439 毫秒(沙箱磁盘慢),剩下的数里还混着读盘的抖动。
  所以末列只作横向比较,别当 Flask 的固有开销。
  真正稳的是中间那一列:模块数由代码结构决定,跑几遍都一样。
  ! 越大的框架,一 import 就拉进来越多东西。这不是说它不好,是说要付代价。

  ① Flask 自己有多少依赖
  --------------------------------------------------------------------
  必装 6 个:blinker、click、itsdangerous、jinja2、markupsafe、werkzeug
  可选 3 个:importlib-metadata(仅旧 Python 需要)、asgiref(async)、python-dotenv(dotenv)
  ! 教材写的是「五个依赖」,这次数出来是 6 个——多的是 blinker。
  Flask 2.3 把信号机制拆成独立包,2.x 的书自然数不到它。
  六个里只有两个是你天天要打交道的:Werkzeug 管请求与路由,Jinja2 管模板;
  其余四个是胶水(命令行、签名、转义、信号)。

  ② 四个框架的分界
  --------------------------------------------------------------------

| 框架 | 模板 | 数据库 | 后台 | 一句话 |
|---|---|---|---|---|
| Django | 自带 | 自带 ORM | 自带后台 | 最重,也最省心 |
| Flask | 自己选 | 自己选 | 自己装 | 最轻,也最费心 |
| Bottle | 单文件 | 无 | 无 | 一个文件就是一个应用 |
| FastAPI | 自己选 | 自己选 | 自动文档 | 为 API 而生,带类型校验 |

  ! 分界只有一条:它替你决定多少。决定越多,上手越快,改起来越难。

  [平台原样 · 本沙箱不执行]
  | # Django:先有项目骨架,才有代码
  | django-admin startproject mysite
  | ./manage.py startapp polls
  | # 目录里自动长出 settings.py / urls.py / wsgi.py / admin.py
  |
  | # FastAPI:装饰器长得像 Flask,但参数要标类型
  | from fastapi import FastAPI
  | app = FastAPI()
  |
  | @app.get("/items/{item_id}")
  | def read_item(item_id: int, q: str | None = None):
  |     return {"item_id": item_id, "q": q}
  Django 与 FastAPI 在本沙箱没装、也不打算装——这两个只作对照,不执行。

  ! FastAPI 那句 item_id: int 不是注释,是校验规则:传 abc 进去自动回 422。
  Flask 里同样的活要自己写。

模块数是硬指标:由代码结构决定,跑几遍都一样,最适合做横向比较。 耗时那一列受沙箱磁盘影响很大,只能看数量级——flask 一秒上下,sklearn 四秒多。 顺带数了一下 Flask 的依赖:必装 6 个。教材说 5 个,多出来的是 blinker,Flask 2.3 才拆出去的。 最后那段 Django 与 FastAPI 的代码标了「平台原样」,是给你对照语法的,不代表在这里跑过。

30 秒实验

  1. 把表里再加一行 tensorflow 或 torch(如果装了的话),看模块数飙到多少。
  2. 把 pandas 换成 json,看标准库和一个大框架差了几个数量级。
  3. 想一想你现在手上的项目:它是「表单多」还是「只给程序调」?答案基本就定了选型。

常见误区

  1. 拿「谁快」当第一标准:这个量级的项目,开发速度和改动成本比框架开销重要。
  2. 以为 Bottle 轻所以更好:轻到一定程度,你要自己补的东西比省下的更多。
  3. 在 Flask 里硬造 Django 那套:目录、ORM、后台全自己搭一遍,那不如直接用 Django。
  4. 以为 FastAPI 能完全替代 Flask:服务端渲染模板那块,它一直不是强项。
自测三问(点开对答案) 1. Django 与 Flask 最本质的差别是什么? —— Django 全替你决定,Flask 只决定四件事。决定越多上手越快,改起来越难。 2. 什么样的项目该选 FastAPI? —— 只做 API、前后端分离、看重参数类型校验和自动文档的项目。 3. 这本书为什么选 Flask? —— 因为它既要写网页又要写 API,还得自由挑数据库和登录方案,正好落在 Flask 的位置上。

框架选定了,下一步是把它装起来。 下一篇讲解释器、虚拟环境和 flask 命令,顺带把教材里三条已经过时的写法点出来。

相关笔记