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
相关产品推荐
相关产品推荐

