验证 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。
真实测两种常见连接失败:用curl连transport端口TCP能连上但收到HTTP/0.9报错,因为transport走的是不同的二进制协议;搭两个cluster.name不同的节点互连,真实都卡死在启动阶段连HTTP服务都没起来,日志记录remote cluster name与local cluster name不匹配导致握手失败。
打印一个真实请求上的 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 的实测默认值与超限行为。
验证匿名访问配置指向尚未创建的角色时请求依然401;创建只给cluster:monitor的最小化anon_role后查health能用但查索引数据被拒绝;故意把anon_role改宽成对所有索引给read权限后,同一条不带凭证的查询直接读出了本应保密的文档内容,印证匿名访问机制本身不危险,危险的是配置给匿名角色的权限范围。
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 与类型可被客户端伪造。