知其然,知其所以然
Flask 内部机制 2026-10-02

Flask-WTF 表单校验

实测 Flask-WTF 的表单校验:Email() 依赖 email_validator;csrf_token 的结构与 session 的关系;各字段的错误信息;validate_on_submit 在 GET 时的行为;CSRF 的缺失、不匹配、篡改、过期四种报错;请求头与 JSON 为什么 FlaskForm 不认而要用 CSRFProtect;文件上传校验。

Flask Flask-WTF WTForms CSRF 表单验证 真实验证 动画演示
Flask 内部机制 2026-10-02

Flask-Migrate Migration

用真实的 flask db 命令在 SQLite 上走一遍 Flask-Migrate:init 生成的目录、migrate 只生成脚本、upgrade 与 alembic_version、加列加表的迁移内容(SQLite 用 batch_alter_table)、downgrade 与 history、重命名列被识别成删加、两个 head 报错与 merge。

Flask Flask-Migrate Alembic 数据库迁移 真实验证 动画演示
Flask 内部机制 2026-10-02

Flask-Caching 缓存机制

实测 Flask-Caching:cached 的命中与过期、查询参数默认不参与缓存键、memoize 与 delete_memoized、RedisCache 里的键与 TTL、FileSystemCache 的文件、多 worker 下 SimpleCache 各算各的、缓存击穿时 8 个并发请求计算 8 次、命中 0.59 ms 对未命中 53.1 ms。

Flask Flask-Caching 缓存 Redis 真实验证 动画演示
Flask 内部机制 2026-10-02

Flask-Limiter 限流

实测 Flask-Limiter:固定窗口 5 per minute 的 200/429 与 X-RateLimit、Retry-After 头;多个限制、共享限制、cost、exempt;fixed-window 与 moving-window 在窗口边界的差别;memory 存储下 3 个 worker 放行 14 次而 redis 只放行 5 次;代理后面按 IP 限流的陷阱;memory 限流每请求多约 47 µs。

Flask Flask-Limiter 限流 429 Redis 真实验证 动画演示
Flask 内部机制 2026-10-02

Flask-Mail 邮件发送

用本机的 SMTP 服务实测 Flask-Mail:服务端收到的原始邮件(中文主题的编码、MIME 结构、信封与头里的收件人)、附件与密送、TESTING 下的 suppress 与 outbox、头注入检查、同步 send 阻塞 515 ms 与线程发送、SMTP 不可用时的异常、mail.connect() 复用连接。

Flask Flask-Mail SMTP 邮件 真实验证 动画演示
Flask 内部机制 2026-10-02

Flask-SocketIO 长连接

实测 Flask-SocketIO:握手的原始数据包(OPEN、CONNECT、EVENT、ACK)、先轮询再升级 websocket、事件与 ack、拒绝连接、房间与广播、kill -9 与 SIGSTOP 两种断线的检测时间(0.01 s 对 1.87 s)、2 个 worker 下无 message_queue 广播只到 5 个客户端、polling 与 websocket 的往返延迟。

Flask Flask-SocketIO WebSocket 长连接 真实验证 动画演示
Flask 内部机制 2026-10-02

Flask-CORS 跨域处理

实测 Flask-CORS:默认配置回显 Origin、预检请求的响应与被拒时的样子、白名单外的请求仍被处理、supports_credentials 的 Allow-Origin、resources 与 cross_origin 的作用范围、错误响应也带 CORS 头,并用真实的无头 Chrome 验证被拦截的是响应而不是请求。

Flask Flask-CORS 跨域 CORS 预检请求 真实验证 动画演示
Flask 内部机制 2026-10-02

自定义 Flask Extension

亲手写一个遵守约定的 Flask 扩展并逐项验证:init_app 与 app.extensions、配置默认值与优先级、顺手注册模板过滤器 after_request 与命令行、用 g 懒创建连接并在 teardown 里关闭、状态放扩展对象上 8 个并发请求有 7 个串数据而放 g 上是 0 个。

Flask 自定义扩展 init_app teardown 真实验证 动画演示
Flask 内部机制 2026-10-02

Flask-SQLAlchemy 初始化过程

用真实的 PostgreSQL 数连接,实测 Flask-SQLAlchemy 的初始化:init_app 只创建 Engine 不连数据库(连接数 0),第一次执行 SQL 才连(6.4 ms,第二次 0.74 ms);SQLite 相对路径落在 instance 目录;ENGINE_OPTIONS 与 BINDS;模型与 create_all;db.session 的作用域;连不上数据库要到第一次 SQL 才报错。

Flask Flask-SQLAlchemy init_app Engine 连接池 真实验证 动画演示
Flask 内部机制 2026-10-02

SQLAlchemy Session 生命周期

实测 SQLAlchemy Session 的生命周期:对象的 transient、pending、persistent、deleted、detached 状态转换;用 pg_stat_activity 看自动开始的事务(idle in transaction)与 commit 后的 idle;一次 commit 触发的事件顺序;请求结束后没 commit 的改动被丢弃、对象变成 detached 后的 DetachedInstanceError。

Flask SQLAlchemy Session 事务 连接 真实验证 动画演示
Flask 内部机制 2026-10-02

Flask 请求与数据库事务边界

用真实的 PostgreSQL 与 gunicorn 实测 Flask 请求与数据库事务的边界:不 commit 就丢、每次 commit 一个独立事务、commit 前后出错的差别、原子回滚、flush 出错后 PendingRollbackError、保存点、写事务阻塞同一行 1382 ms 而只读长事务不挡写、after_request 统一提交。

Flask SQLAlchemy 事务 commit rollback 真实验证 动画演示
Flask 内部机制 2026-10-02

Model 与 Table 映射

在真实的 PostgreSQL 上实测 Model 与 Table 的映射:类名到表名的转换、没有主键时定义类就报错、各 Column 类型生成的 DDL 与 PG 里实际的列和索引、default 与 server_default 只在 ORM 与绕过 ORM 时的差别、约束违反的异常类型、Mapped[] 注解决定可空、db.reflect() 映射已有的表。

Flask SQLAlchemy Model Table DDL 真实验证 动画演示
京ICP备2026067502号-1京公网安备11010502063487号