Flask 可以在响应中发送重复的 headers 吗?

Can flask send duplicate headers in a response?

我希望我的 Flask 应用程序设置多个具有相同键和不同值的 header,如下所示:

Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers

我已经知道这等同于单个 header 其值为 comma-separated 列表(当然仅适用于支持列表值的 header),但是我宁愿像上面那样做。但是 headers 存储在字典中,所以我不能只添加一个重复的键。

我也知道 this question and answer,它说 requests 模块不能用同一个密钥发送多个 header。但是那个问题是关于 requests,而 flask 有时会有额外的好处;还有这个问题已经七年多了,事情发生了。

这个答案是最新的吗?它也适用于烧瓶吗?

请求Headers

您可以有重复的 header 键,但是,Flask 将它们转换为文本,值以逗号分隔,

最简单的例子是:

from flask import Flask, request

app = Flask(__name__)

@app.route('/')
def index():
    print(request.headers)
    return "Hello"

具有以下 curlcurl http://127.0.0.1:5000 -H 'X-HEADER: 1' -H 'X-HEADER: 2'

Flask 将在 header 秒内为 X-Header 打印 X-Header: 1,2 此外,您可以使用 request.headers.getlist('X-Header') 获取值列表,但它仍然将值粘在一起,并且 returns 是一个只有一个元素的列表。 ['1,2']

request.headerswerkzeug.datastructures.EnvironHeaders

的实例

您当然可以修改它以使用您自己的 headers class。 您可以继承 flask.Request class 并使用自定义 Headers class

创建自己的 request 实例

您可以在此处阅读有关 EnvironHeaders 的更多信息:https://werkzeug.palletsprojects.com/en/1.0.x/datastructures/#werkzeug.datastructures.EnvironHeaders

回应Headers

关于回复 headers:

所有烧瓶响应来自 flask.Response class.

您可以 return 从您的角度做出回应,例如:

from flask import flask, Response

app = Flask(__name__)

@app.route('/')
def index():
    return Response('Hello', headers={'X-Headers': [1, 2]})

您可以使用以下 curl 进行测试: curl http://127.0.0.1:5000 -vvv 我添加了 -vvv 以增加冗长并显示 Headers

响应中将显示以下内容 headers:

< X-Headers: 1
< X-Headers: 2

此外,如果您不想使用 Response class, 您可以 return 一个视图中的多个值

@app.route('/')
def index():
    return '<h1>Hello!</h1>', 200, {'X-Headers': [1, 2]}

第一个值是您回复的body,第二个是状态码,最后一个是您回复的header。