实测 Flask-Login 的登录流程:未登录重定向与 next 参数、AnonymousUserMixin、login_user 写进 session 的键、user_loader 每个请求调用一次、remember_token cookie 与 fresh 标记、登出清 cookie、session_protection 的 basic 与 strong、API 的 401 处理。
实测 Flask-WTF 的表单校验:Email() 依赖 email_validator;csrf_token 的结构与 session 的关系;各字段的错误信息;validate_on_submit 在 GET 时的行为;CSRF 的缺失、不匹配、篡改、过期四种报错;请求头与 JSON 为什么 FlaskForm 不认而要用 CSRFProtect;文件上传校验。
用真实的 flask db 命令在 SQLite 上走一遍 Flask-Migrate:init 生成的目录、migrate 只生成脚本、upgrade 与 alembic_version、加列加表的迁移内容(SQLite 用 batch_alter_table)、downgrade 与 history、重命名列被识别成删加、两个 head 报错与 merge。
实测 Flask-Caching:cached 的命中与过期、查询参数默认不参与缓存键、memoize 与 delete_memoized、RedisCache 里的键与 TTL、FileSystemCache 的文件、多 worker 下 SimpleCache 各算各的、缓存击穿时 8 个并发请求计算 8 次、命中 0.59 ms 对未命中 53.1 ms。
实测 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。
用本机的 SMTP 服务实测 Flask-Mail:服务端收到的原始邮件(中文主题的编码、MIME 结构、信封与头里的收件人)、附件与密送、TESTING 下的 suppress 与 outbox、头注入检查、同步 send 阻塞 515 ms 与线程发送、SMTP 不可用时的异常、mail.connect() 复用连接。
实测 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-CORS:默认配置回显 Origin、预检请求的响应与被拒时的样子、白名单外的请求仍被处理、supports_credentials 的 Allow-Origin、resources 与 cross_origin 的作用范围、错误响应也带 CORS 头,并用真实的无头 Chrome 验证被拦截的是响应而不是请求。
亲手写一个遵守约定的 Flask 扩展并逐项验证:init_app 与 app.extensions、配置默认值与优先级、顺手注册模板过滤器 after_request 与命令行、用 g 懒创建连接并在 teardown 里关闭、状态放扩展对象上 8 个并发请求有 7 个串数据而放 g 上是 0 个。
用真实的 PostgreSQL 数连接,实测 Flask-SQLAlchemy 的初始化:init_app 只创建 Engine 不连数据库(连接数 0),第一次执行 SQL 才连(6.4 ms,第二次 0.74 ms);SQLite 相对路径落在 instance 目录;ENGINE_OPTIONS 与 BINDS;模型与 create_all;db.session 的作用域;连不上数据库要到第一次 SQL 才报错。
实测 SQLAlchemy Session 的生命周期:对象的 transient、pending、persistent、deleted、detached 状态转换;用 pg_stat_activity 看自动开始的事务(idle in transaction)与 commit 后的 idle;一次 commit 触发的事件顺序;请求结束后没 commit 的改动被丢弃、对象变成 detached 后的 DetachedInstanceError。
用真实的 PostgreSQL 与 gunicorn 实测 Flask 请求与数据库事务的边界:不 commit 就丢、每次 commit 一个独立事务、commit 前后出错的差别、原子回滚、flush 出错后 PendingRollbackError、保存点、写事务阻塞同一行 1382 ms 而只读长事务不挡写、after_request 统一提交。