bigywater.tech
Flask · 23

HTTP 方法限制

路由默认允许哪些方法?不允许的方法得到什么响应?Allow 头里是什么?这篇用 4 种路由和 7 种方法做一张完整的矩阵。

405
方法不在 methods 里时的状态码
7 × 4
本篇矩阵里的方法数 × 路由数
GET、HEAD、OPTIONS
默认路由的 methods

methods 的各种写法

实测 · 本机执行输出
  /default     methods = ['GET', 'HEAD', 'OPTIONS']
  /post-only   methods = ['OPTIONS', 'POST']
  /multi       methods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST']
  /g           methods = ['GET', 'HEAD', 'OPTIONS']
  /p           methods = ['OPTIONS', 'POST']
  /d           methods = ['DELETE', 'OPTIONS']
  /mv          methods = ['GET', 'HEAD', 'OPTIONS', 'POST']

上一篇:静态文件路由的注册方式;下一篇:OPTIONS 与 HEAD 自动处理。

方法矩阵

实测 · 本机执行输出
  路径          GET      POST     PUT      DELETE   PATCH    HEAD     OPTIONS  
  /default    200      405      405      405      405      200      200      
  /post-only  405      200      405      405      405      405      200      
  /multi      200      200      405      200      405      200      200      
  /mv         200      200      405      405      405      200      200      
  PUT /default 的 405 响应: 405 METHOD NOT ALLOWED | Allow = OPTIONS, HEAD, GET
  正文: <!doctype html> | <html lang=en> | <title>405 Method Not Allowed</title> | <h1>Method Not Allowed</h1> | <p>The method is not allowed for the requeste

同一个视图处理多个方法

实测 · 本机执行输出
  GET /multi → multi GET | POST /multi → multi POST | DELETE /multi → multi DELETE
  方法写成小写 "get" 的请求 → 200 multi GET

methods 参数的取值

实测 · 本机执行输出
  methods=["get","post"] 之后规则的 methods: ['GET', 'HEAD', 'OPTIONS', 'POST']
  methods="POST" → TypeError: Allowed methods must be a list of strings, for example: @app.route(..., methods=["POST"])
  methods=["FOO"] 与自定义方法 FOO 请求 → 200

MethodView

实测 · 本机执行输出
  MethodView 的 methods 属性: ['GET', 'POST']
  PUT /mv → 405 | Allow = OPTIONS, HEAD, GET, POST

方法覆盖

实测 · 本机执行输出
  POST + X-HTTP-Method-Override: DELETE → 200 收到 DELETE

分步演示

HTTP 方法
本步的对象

    本文用到的工具与边界

    • 本机 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,数字每次运行会有小幅抖动
    • 没有验证:RESTful 资源的 PATCH 与 PUT 语义、浏览器对 405 页面的呈现、方法覆盖头在反向代理与 CDN 下的行为、真实 HTTP 服务器对非标准方法的处理(这里全部用 test client)
    京ICP备2026067502号-1京公网安备11010502063487号