You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flask中X-HTTP-Method-Override头不生效问题排查

问题排查与解决

直接原因:curl命令的请求头格式错误

你在curl命令里写的请求头"X-HTTP-Method-Override : POST"存在格式问题——冒号后面多了一个空格。虽然HTTP规范允许请求头键值对的冒号后加空格,但WSGI协议在将请求头转换为环境变量时,会把所有非字母数字的字符(包括空格)替换成下划线。这就导致这个头会被转换成HTTP_X_HTTP_METHOD_OVERRIDE_(末尾多了一个下划线),而你的代码里是从HTTP_X_HTTP_METHOD_OVERRIDE这个键取值,自然拿不到正确的方法值,所以服务器仍然返回GET。

修正后的curl命令应该去掉冒号后的空格:

curl -X GET "http://127.0.0.1:9090" --header "X-HTTP-Method-Override: POST"

代码优化建议(可选)

为了避免这类请求头格式的小问题导致功能失效,可以优化代码中获取请求头的逻辑,兼容带空格的情况:

class HTTPMethodOverrideMiddleware(object):
    allowed_methods = frozenset(
        ["GET", "HEAD", "POST", "DELETE", "PUT", "PATCH", "OPTIONS"]
    )
    bodyless_methods = frozenset(["GET", "HEAD", "OPTIONS", "DELETE"])

    def __init__(self, app):
        self.app = app

    def __call__(self, environ, start_response):
        # 兼容请求头冒号后带空格的情况
        method = environ.get("HTTP_X_HTTP_METHOD_OVERRIDE", "")
        if not method:
            method = environ.get("HTTP_X_HTTP_METHOD_OVERRIDE_", "")
        method = method.upper()
        
        if method in self.allowed_methods:
            environ["REQUEST_METHOD"] = method
        if method in self.bodyless_methods:
            environ["CONTENT_LENGTH"] = "0"
        return self.app(environ, start_response)

用修正后的curl命令测试,服务器会返回POST,符合预期。

内容的提问来源于stack exchange,提问作者mazix

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 12:13:16