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

路由冲突如何解决

实测 Flask 路由冲突:同名 endpoint 会 AssertionError;同一 URL 被不同端点注册不会报错、先注册的赢(应用与蓝图也一样);同蓝图多次注册要 name=;通配路由不吃具体路由;一个检查重复(模式+方法)的脚本;flask routes --sort。

Flask 路由冲突 endpoint 蓝图 真实验证 动画演示
Flask 内部机制 2026-10-02

Blueprint 路由注册

验证 Blueprint 路由注册:蓝图只记录(deferred_functions),register_blueprint 时才写进 url_map;注册后不能再加路由;endpoint 带蓝图名前缀;嵌套蓝图的 endpoint 与 request.blueprints;蓝图钩子与上下文处理器的作用范围;按包拆分应用的实际运行。

Flask Blueprint 蓝图 路由注册 真实验证 动画演示
Flask 内部机制 2026-10-02

Blueprint 的 URL 前缀

实测 Blueprint 的 URL 前缀:定义时与注册时的 url_prefix(注册时覆盖);与 /、空串、尾斜杠的拼接结果与访问行为;嵌套蓝图逐层叠加或覆盖;同一蓝图多前缀注册的 endpoint;前缀包含关系下的重复规则。

Flask Blueprint url_prefix 路由 真实验证 动画演示
Flask 内部机制 2026-10-02

Blueprint 的静态文件和模板目录

实测 Blueprint 的静态文件与模板目录:root_path/template_folder/static_folder 的相对关系;蓝图静态端点 admin.static 与自定义 static_url_path;同名模板时应用优先于蓝图、先注册的蓝图赢;EXPLAIN_TEMPLATE_LOADING 的查找日志与多匹配警告;用「蓝图名」子目录避免撞名。

Flask Blueprint 静态文件 模板 真实验证 动画演示
Flask 内部机制 2026-10-02

子域名路由

实测 Flask 子域名路由:默认(或只设 SERVER_NAME)子域名规则不参与匹配,要用 subdomain_matching=True;api、<user> 子域匹配;www 也会落到 <user>;Host 不匹配 SERVER_NAME 时变成 <invalid> 子域并发出警告;带端口;url_for 生成完整 URL;用真实 HTTP 与 Host 头验证;SESSION_COOKIE_DOMAIN。

Flask 子域名路由 SERVER_NAME subdomain_matching 真实验证 动画演示
Flask 内部机制 2026-10-02

URL 中的 Unicode 与编码

实测 URL 里的 Unicode 与编码:中文路径解码成 str(PATH_INFO 是 latin-1 形式);+、%20、%2B 在查询里的差别;%2F 在 string 与 path 段里的不同;非法 UTF-8 被替换成 �、零字节进入视图;url_for 与 redirect 的编码;gunicorn 对未编码的原始 UTF-8 请求行返回 404。

Flask Unicode URL 编码 路径 真实验证 动画演示
Flask 内部机制 2026-10-02

Werkzeug Request 对象

打印一个真实请求上的 Flask Request 属性(url、base_url、url_root、script_root、host、scheme、remote_addr、endpoint、view_args、content_type 等);Flask 自己加的成员很少,其余来自 Werkzeug;args/form 惰性解析;请求体只能读一次;X-Forwarded-For 不被自动采信;构造并读取约 3.2 µs。

Flask Request Werkzeug 请求对象 真实验证 动画演示
Flask 内部机制 2026-10-02

Query String 参数解析

实测查询字符串解析:request.args 是 ImmutableMultiDict(get 取第一个、getlist 取全部、不可修改);没有等号、重复 &、分号、k[] 等边界写法;type= 转换失败返回默认值;args[缺失] 变 400;gunicorn 默认 4094 字节的请求行上限;request.values 合并 args 与 form。

Flask 查询字符串 request.args MultiDict 真实验证 动画演示
Flask 内部机制 2026-10-02

Form Data 与 JSON Body

实测请求体的解析:urlencoded、multipart、JSON、text/plain 分别落在 form、files、get_json、get_data;get_json 在 Content-Type 不对时 415、JSON 非法时 400、force=True 与缓存;同名字段与 getlist;MAX_FORM_PARTS 与 MAX_FORM_MEMORY_SIZE 的实测默认值与超限行为。

Flask 表单 JSON 请求体 Content-Type 真实验证 动画演示
Flask 内部机制 2026-10-02

request.args、request.form、request.json

12 种请求(GET/POST/PUT/PATCH/DELETE × 查询串/表单/JSON/multipart/text)里 args、form、files、json、data、values 各自拿到什么;request.json 在非 JSON 时抛 415 而 get_json(silent=True) 返回 None;values 里 args 在前;JSON 保留类型而查询串与表单都是字符串。

Flask request.args request.form request.json 真实验证 动画演示
Flask 内部机制 2026-10-02

文件上传与 FileStorage

实测文件上传与 FileStorage:filename、content_type、stream(SpooledTemporaryFile)、content_length 为 0;空文件字段与缺失字段的区别;500 KiB 以内留在内存、以上写磁盘临时文件;save 的各种报错与连续保存的坑;curl -F 真实上传,filename 与类型可被客户端伪造。

Flask 文件上传 FileStorage 真实验证 动画演示
Flask 内部机制 2026-10-02

多文件上传

实测多文件上传:同名字段用 getlist 取全部(files[...] 只取第一个);不同字段名用 files.lists();同名文件会互相覆盖需要随机前缀;MAX_FORM_PARTS 把文件与普通字段合计,设为 6 时 6 部分通过、9 部分 413;curl 重复 -F 真实上传 3 个文件。

Flask 多文件上传 getlist 真实验证 动画演示
京ICP备2026067502号-1京公网安备11010502063487号