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

API Token 认证

实测 Flask API 的令牌认证:Bearer 头的各种情况与 401、WWW-Authenticate、403 的区别;令牌只存 sha256 哈希;itsdangerous 签名令牌的 payload 明文可读、篡改与过期都 401;不透明令牌可立即吊销而签名令牌不能;令牌放在查询参数里会进访问日志。

Flask API Token认证 Bearer itsdangerous 真实验证 动画演示
Flask 内部机制 2026-10-02

JWT 登录认证

用 PyJWT 实测 JWT 登录认证:三段结构与明文 payload、algorithms 必须显式指定、exp 默认不强制、leeway、alg=none 与篡改 role 的攻击被拒绝、HS256 与 RS256 的差别与算法混淆被挡住、令牌里的 role 在有效期内不随数据库变化。

Flask JWT PyJWT 登录认证 真实验证 动画演示
Flask 内部机制 2026-10-02

Refresh Token

实测 Refresh Token:短命访问令牌过期后用刷新令牌换新、刷新令牌轮换与重用检测(旧令牌再用会撤销整个家族)、响应丢失后合法重试被误判、登出后访问令牌仍可用到过期、刷新令牌过期、放进限定路径的 HttpOnly cookie。

Flask Refresh Token JWT 令牌轮换 真实验证 动画演示
Flask 内部机制 2026-10-02

API 限流

实测 API 限流的实现细节:令牌桶的突发与补充、20 个线程抢 10 个名额时非原子 GET+SET 放行 20 个而 Lua 脚本只放行 10 个、429 的 Retry-After 与 RateLimit 头、无条件信任 X-Forwarded-For 时限流被随意绕过、按用户与按 IP 限流的差别。

Flask API限流 令牌桶 Redis Lua 真实验证 动画演示
Flask 内部机制 2026-10-02

CORS 预检请求

在真实的无头 Chrome 里验证 CORS 预检:哪些请求触发预检(JSON、自定义头、PUT)与哪些不触发(GET、text/plain)、Max-Age 缓存让 OPTIONS 从 6 个降到 3 个、缺 Allow-Headers 时请求被拦、Authorization 必须明确列出、OPTIONS 要求认证时整个跨域 API 不可用。

Flask CORS 预检请求 Chrome Access-Control-Max-Age 真实验证 动画演示
Flask 内部机制 2026-10-02

ETag API 缓存

实测 Flask API 的 ETag 缓存:add_etag 与 make_conditional 得到 304 与空正文、If-None-Match 列表与弱 ETag、哈希 ETag 的 304 仍要 64 ms 而版本号 ETag 的 304 只要 0.41 ms、Last-Modified 与 If-Modified-Since、48039 字节对 0 字节的带宽差别。

Flask API ETag 条件请求 304 真实验证 动画演示
Flask 内部机制 2026-10-02

OpenAPI 文档生成

实测 Flask 的 OpenAPI 文档生成:用 apispec 从 marshmallow 与 docstring 生成 3.0.3 文档并通过 openapi-spec-validator 校验、校验规则自动变成 minLength 与 minimum 与 readOnly、flask-smorest 一个装饰器同时做校验序列化与文档并自带 /openapi.json 和 Swagger UI、422 的固定格式、schema 改了文档跟着变。

Flask OpenAPI apispec flask-smorest Swagger 真实验证 动画演示
Flask 内部机制 2026-10-02

Marshmallow 序列化

用 marshmallow 4.3.1 实测序列化与校验:dump 只输出声明的字段与 load_only、load 一次返回所有错误且嵌套用下标定位、未知字段的 RAISE 与 EXCLUDE 与 INCLUDE、partial 与钩子、Int 字段把 5.5 截断成 5、dump 10000 个对象比手写字典慢约 23 倍。

Flask Marshmallow 序列化 校验 真实验证 动画演示
Flask 内部机制 2026-10-02

Pydantic 在 Flask 中的使用

用 pydantic 2.13.5 实测 Flask 中的校验与序列化:宽松模式的类型转换与 int_from_float 错误、bool 的接受范围与 strict、直接 jsonify(e.errors()) 会因 bytes 与异常对象而 500、request.args.to_dict 丢掉重复参数、model_dump(mode=json) 与 exclude、校验 10000 个字典 18.6 ms。

Flask Pydantic 校验 序列化 真实验证 动画演示
Flask 内部机制 2026-10-02

大批量 JSON 响应

实测 Flask 大批量 JSON 响应:10 万行 jsonify 95 ms、11.1 MB、峰值内存约 22 MB;orjson 比标准库快约 8 倍;debug 模式让响应变大;gzip 压到约 10%;真实 gunicorn 里首字节时间等于生成时间,超过 worker timeout 会被杀。

Flask JSON 大响应 orjson gzip 真实验证 动画演示
Flask 内部机制 2026-10-02

Streaming JSON

在 50 万行 PostgreSQL 数据上实测流式 JSON:一次性 jsonify 首字节 1698 ms、内存多 352 MB,流式首块 114 ms、内存只多约 1 MB 但总时间 3.1 倍;流式 JSON 数组合法性;流到一半出错时状态码已是 200、客户端 IncompleteRead;客户端断开时生成器收到 GeneratorExit。

Flask 流式响应 NDJSON stream_with_context 真实验证 动画演示
Flask 内部机制 2026-10-02

SECRET_KEY 的用途

实测 SECRET_KEY 的用途与风险:没设时 session 报 RuntimeError、cookie 载荷明文可读、知道 key 就能伪造 role=admin、换 key 让所有人被登出、SECRET_KEY_FALLBACKS 平滑轮换、弱 key 用词表瞬间被猜中而强 key 对 20 万个候选无一命中。

Flask SECRET_KEY session 安全 真实验证 动画演示
京ICP备2026067502号-1京公网安备11010502063487号