bigywater.tech
Flask · 24

OPTIONS 与 HEAD 自动处理

谁在默默处理 OPTIONS 与 HEAD 请求?视图函数会不会被执行?预检请求为什么会被鉴权拦掉?这篇用最小的例子把这些都实测出来。

0 字节
HEAD 响应的正文大小(但视图仍然执行了)
Allow
自动 OPTIONS 响应里携带的头
0
没有 flask-cors 时预检响应里的 Access-Control-* 头个数

自动 OPTIONS

实测 · 本机执行输出
  OPTIONS /res → 200 OK | {'Content-Type': 'text/html; charset=utf-8', 'Allow': 'OPTIONS, GET, POST, HEAD', 'Content-Length': '0'} | 正文长度 0
  这次请求触发的回调: ['before:OPTIONS']

上一篇:HTTP 方法限制;下一篇:路由冲突如何解决;跨域预检的专题:CORS 预检请求。

自动 HEAD

实测 · 本机执行输出
  GET → 200 Content-Length 11 正文 11
  HEAD → 200 Content-Length 11 正文 0
  视图函数里记录到的方法: ['GET', 'HEAD']

自己处理 OPTIONS

实测 · 本机执行输出
  OPTIONS /custom → 204 | Allow = GET, OPTIONS | X-Custom = 1

关闭自动 OPTIONS

实测 · 本机执行输出
  OPTIONS /noauto → 405 | Allow = GET, HEAD
  noauto 规则的 methods = ['GET', 'HEAD']

before_request 与 OPTIONS

实测 · 本机执行输出
  OPTIONS /res 触发的回调: ['before:OPTIONS']

跨域预检

实测 · 本机执行输出
  → 200 | {'Allow': 'OPTIONS, GET, POST, HEAD'}

分步演示

OPTIONS 与 HEAD
本步的对象

    本文用到的工具与边界

    • 本机 macOS 27 arm64 / Python 3.14.7 / Flask 3.1.3 / Werkzeug 3.1.9 / Jinja2 3.1.6 / SQLAlchemy 2.1.1 / gunicorn 26.2.0(都装在自己的虚拟环境里);大多数实验用 Flask 的 test_client(直接调用 WSGI 应用,不经过网络),需要真实 HTTP 时另起 gunicorn 或开发服务器(端口 9600 以上,本机 127.0.0.1);计时用 time.perf_counter,数字每次运行会有小幅抖动
    • 没有验证:flask-cors 对预检的处理(见第 79 篇)、HEAD 请求在生成器响应上的行为、真实浏览器发出的预检请求的完整头、HTTP 服务器(gunicorn)对 HEAD 的额外处理
    京ICP备2026067502号-1京公网安备11010502063487号