【问题标题】:Flask/Eve + WSGI and HTTP_X_HTTP_METHOD_OVERRIDEFlask/Eve + WSGI 和 HTTP_X_HTTP_METHOD_OVERRIDE
【发布时间】:2024-01-02 06:53:01
【问题描述】:

我试图了解 WSGI 环境 HTTP 标头如何以及何时在应用程序的请求对象中重命名。

我正在尝试 Eve,我正在使用 X-HTTP-Method-Override 发送 POST 或 PUT。

Eve 中的代码正在尝试使用以下代码 (here) 访问请求标头:

return request.headers.get('X-HTTP-Method-Override', request.method)

在我的 WSGI 环境中,我有一个带有值 PATCH 的 HTTP_X_HTTP_METHOD_OVERRIDE。

当我尝试进行 request.headers 转储时,我得到:

Request Header: ('X-Http-Method-Override', u'PATCH')
Request Header: ('Origin', u'http://localhost:9000')
Request Header: ('Content-Length', u'622')
Request Header: ('Host', u'localhost:24435')
Request Header: ('Accept', u'application/json;charset=UTF-8')
Request Header: ('Content-Type', u'application/json')
Request Header: ('Accept-Encoding', u'identity')

我在网上查了一下,其他 Python 应用程序正在尝试访问这个特定的请求标头与案例:

X-HTTP-Method-Override 而不是 X-Http-Method-Override(我收到请求)

【问题讨论】:

    标签: python flask wsgi eve


    【解决方案1】:

    Flask 负责为您从 WSGI 环境变量中提取标头,在此过程中删除初始的 HTTP_ 前缀。前缀在 WSGI 环境中用于将标头与其他 WSGI 信息区分开来,但是一旦您将标头提取到专用结构中,该前缀就完全多余了。

    request 对象还为您提供了一个专门的字典,其中键匹配不区分大小写。在这里使用什么大小写无关紧要,只要小写版本与小写标题键匹配即可; httpHttpHTTPHtTp 都是有效的大小写变体。这是因为 HTTP 标准明确规定在处理标头时应该忽略大小写。

    请参阅 Werkzeug 文档中的 Headers class reference,它是 request.headers 对象的基础。它又与wsgiref.headers.Headers class 兼容,包括:

    对于这些方法中的每一个,键是标头名称(不区分大小写),值是与该标头名称关联的第一个值。

    强调我的。

    【讨论】:

    • 换句话说,WSGI 规范要求 WSGI 服务器以 CGI 样式将标头传递为“HTTP_*”。某些框架会撤消该操作,因此可以使用原始标头名称。
    • @GrahamDumpleton:完全正确,他们这样做是因为 WSGI 环境包含更多的标头,它是 HTTP_ 前缀对信息进行分组。