实测 Flask 路由冲突:同名 endpoint 会 AssertionError;同一 URL 被不同端点注册不会报错、先注册的赢(应用与蓝图也一样);同蓝图多次注册要 name=;通配路由不吃具体路由;一个检查重复(模式+方法)的脚本;flask routes --sort。
验证 Blueprint 路由注册:蓝图只记录(deferred_functions),register_blueprint 时才写进 url_map;注册后不能再加路由;endpoint 带蓝图名前缀;嵌套蓝图的 endpoint 与 request.blueprints;蓝图钩子与上下文处理器的作用范围;按包拆分应用的实际运行。
实测 Blueprint 的 URL 前缀:定义时与注册时的 url_prefix(注册时覆盖);与 /、空串、尾斜杠的拼接结果与访问行为;嵌套蓝图逐层叠加或覆盖;同一蓝图多前缀注册的 endpoint;前缀包含关系下的重复规则。
实测 Blueprint 的静态文件与模板目录:root_path/template_folder/static_folder 的相对关系;蓝图静态端点 admin.static 与自定义 static_url_path;同名模板时应用优先于蓝图、先注册的蓝图赢;EXPLAIN_TEMPLATE_LOADING 的查找日志与多匹配警告;用「蓝图名」子目录避免撞名。
实测 Flask 子域名路由:默认(或只设 SERVER_NAME)子域名规则不参与匹配,要用 subdomain_matching=True;api、<user> 子域匹配;www 也会落到 <user>;Host 不匹配 SERVER_NAME 时变成 <invalid> 子域并发出警告;带端口;url_for 生成完整 URL;用真实 HTTP 与 Host 头验证;SESSION_COOKIE_DOMAIN。
实测 URL 里的 Unicode 与编码:中文路径解码成 str(PATH_INFO 是 latin-1 形式);+、%20、%2B 在查询里的差别;%2F 在 string 与 path 段里的不同;非法 UTF-8 被替换成 �、零字节进入视图;url_for 与 redirect 的编码;gunicorn 对未编码的原始 UTF-8 请求行返回 404。
打印一个真实请求上的 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。
实测查询字符串解析:request.args 是 ImmutableMultiDict(get 取第一个、getlist 取全部、不可修改);没有等号、重复 &、分号、k[] 等边界写法;type= 转换失败返回默认值;args[缺失] 变 400;gunicorn 默认 4094 字节的请求行上限;request.values 合并 args 与 form。
实测请求体的解析: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 的实测默认值与超限行为。
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 保留类型而查询串与表单都是字符串。
实测文件上传与 FileStorage:filename、content_type、stream(SpooledTemporaryFile)、content_length 为 0;空文件字段与缺失字段的区别;500 KiB 以内留在内存、以上写磁盘临时文件;save 的各种报错与连续保存的坑;curl -F 真实上传,filename 与类型可被客户端伪造。
实测多文件上传:同名字段用 getlist 取全部(files[...] 只取第一个);不同字段名用 files.lists();同名文件会互相覆盖需要随机前缀;MAX_FORM_PARTS 把文件与普通字段合计,设为 6 时 6 部分通过、9 部分 413;curl 重复 -F 真实上传 3 个文件。