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

SQLAlchemy 查询日志

实测 SQLAlchemy 的查询日志:SQLALCHEMY_ECHO 的输出格式与 generated in 对 cached since、DEBUG 打印返回行、参数里的敏感值与 hide_parameters、RECORD_QUERIES 的每条耗时、用事件实现 100 ms 阈值的慢查询日志、1000 次查询时 INFO 日志多出约 21% 耗时。

Flask SQLAlchemy 查询日志 echo 慢查询 真实验证 动画演示
Flask 内部机制 2026-10-02

Flask-Migrate Migration 文件

实测 Flask-Migrate 迁移文件:文件名与 revision 变量、自动生成能检测与检测不到的改动(server_default 的变化不检测、改名被识别成删加)、没有名字的唯一约束在 SQLite 上 upgrade 失败、手写数据迁移、upgrade --sql 离线输出、stamp 只改版本记录。

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

数据迁移回滚

实测迁移回滚:downgrade 删列后数据不会回来;同一个迁移里第二步失败时,PostgreSQL 整体回滚而 SQLite 留下半应用状态(再 upgrade 报 duplicate column);不可逆迁移在 downgrade 里主动报错;downgrade 到 -1、指定版本与 base。

Flask Flask-Migrate downgrade 回滚 事务性DDL 真实验证 动画演示
Flask 内部机制 2026-10-02

SQLite 与 PostgreSQL 行为差异

同一份 SQLAlchemy 代码在 SQLite 与 PostgreSQL 上的行为差异实测:类型与长度是否强制、时区是否丢失、外键是否生效、LIKE 是否区分大小写、删除最大 id 后主键是否复用、两个写者并发时 SQLite 报 database is locked 而 PostgreSQL 不等待。

Flask SQLite PostgreSQL SQLAlchemy 真实验证 动画演示
Flask 内部机制 2026-10-02

数据库连接断开后的恢复

在真实的 PostgreSQL 上重启与停掉数据库,实测断线后的恢复:默认配置重启后只有第一个请求失败(池整体失效),pool_pre_ping 时 0 个失败;停机时快速 503、启动后第一次请求就恢复;connection_invalidated 判断能否重试;执行中被杀的请求 pre_ping 救不了;pool_recycle 按年龄换连接。

Flask SQLAlchemy 断线重连 pool_pre_ping 真实验证 动画演示
Flask 内部机制 2026-10-02

Flask 实现 JSON API

实测 Flask 实现 JSON API 的基本行为:返回 dict 与 list 自动转 JSON、默认排序键与转义中文、datetime 变成 HTTP 日期字符串而 set 不能序列化、get_json 在非法 JSON 与错误 Content-Type 时的 400 与 415、返回 None 是 500、自定义 JSON provider、序列化开销。

Flask JSON API jsonify get_json 真实验证 动画演示
Flask 内部机制 2026-10-02

API 错误响应统一格式

实测 Flask API 错误响应的统一格式:默认所有错误都是 HTML;用 HTTPException、自定义 ApiError 与 Exception 三个处理器统一成 {error: {code, message, request_id}};405 的 Allow 头保留、500 不泄漏异常信息;按路径前缀区分 API 与页面;蓝图的 404 处理器抓不到未匹配的路由。

Flask API 错误处理 errorhandler 真实验证 动画演示
Flask 内部机制 2026-10-02

请求参数校验

实测 Flask 请求参数校验的陷阱:args.get(type=int) 转换失败悄悄回退并接受带空格、下划线、Unicode 数字;type=float 接受 nan 与 inf;type=bool 对 "false" 返回 True;int 转换器不匹配是 404;request.json 缺键是 500 而不是 400;手写校验一次返回全部错误;MAX_CONTENT_LENGTH 返回 413。

Flask 请求校验 参数校验 422 MAX_CONTENT_LENGTH 真实验证 动画演示
Flask 内部机制 2026-10-02

API 分页

在 20 万行的 PostgreSQL 表上实测 API 分页:OFFSET 分页第 1 页 0.67 ms 到第 9999 页 9.71 ms,键集分页稳定在约 0.60 ms;翻页时删行造成 OFFSET 漏行;游标的编码与校验;db.paginate 的 max_per_page 与越界 404。

Flask API 分页 keyset OFFSET 真实验证 动画演示
Flask 内部机制 2026-10-02

API 版本控制

实测 Flask API 版本控制的两种做法:URL 前缀的蓝图(/v1 与 /v2 共用业务代码、未注册版本 404、蓝图 after_request 只给 v1 加 Deprecation 与 Sunset 头)和请求头版本(Accept 协商、q 值、*/* 取第一个、406 与 400、Flask 不自动加 Vary)。

Flask API 版本控制 蓝图 Accept 真实验证 动画演示
Flask 内部机制 2026-10-02

RESTful URL 设计

实测 Flask 里 RESTful URL 设计的细节:POST 201 加 Location、PUT 整体替换与 PATCH 部分更新、DELETE 204、405 的 Allow 头与自动的 OPTIONS 和 HEAD、尾部斜杠的 308 与 404、静态路径优先于动态路径、转换器的匹配、嵌套资源要自己校验归属、POST 不幂等而 PUT 幂等。

Flask RESTful URL设计 HTTP方法 真实验证 动画演示
Flask 内部机制 2026-10-02

Idempotency-Key

在真实的 PostgreSQL 与 gunicorn 上实测 Idempotency-Key:没有 key 时超时重试造成 2 个订单、有 key 时重放返回同一结果(Idempotent-Replayed)、同 key 不同请求体 422、并发 6 个相同请求时「先查再写」写入 6 个而「先占位」只写 1 个。

Flask API 幂等 Idempotency-Key 并发 真实验证 动画演示
京ICP备2026067502号-1京公网安备11010502063487号