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

ale*_*xis 2 python http-headers flask python-requests

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

Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Run Code Online (Sandbox Code Playgroud)

我已经知道这相当于一个值是逗号分隔列表的单个标头(当然,仅适用于支持列表值的标头),但我宁愿按照上面的方式进行操作。但标头存储在字典中,所以我不能只添加重复的键。

我也知道这个问题和答案,它说requests模块不能使用相同的密钥发送多个标头。但这个问题是关于 的requestsflask有时还有额外的好处;这个问题也已经七年多了,事情就发生了。

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

Dar*_*iuM 5

请求标头

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

最简单的例子是:

from flask import Flask, request

app = Flask(__name__)

@app.route('/')
def index():
    print(request.headers)
    return "Hello"
Run Code Online (Sandbox Code Playgroud)

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

Flask 会在 headers 中打印X-Header: 1,2forX-Header另外,您可以使用 获取值列表request.headers.getlist('X-Header'),但它仍然将这些值粘在一起并返回一个仅包含一个元素的列表。['1,2']

request.headers是一个实例werkzeug.datastructures.EnvironHeaders

当然,您可以修改它以使用您自己的标头类。您可以继承类并使用自定义类flask.Request创建自己的request实例Headers

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

响应头

关于响应头:

所有烧瓶反应均来自flask.Response课堂。

您可以从您的视图返回您的响应,例如:

from flask import Flask, Response

app = Flask(__name__)

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

您可以使用以下命令进行测试curlcurl http://127.0.0.1:5000 -vvv 我添加了-vvv以增加详细程度并显示标题

以下内容将显示在响应标头中:

< X-Headers: 1
< X-Headers: 2
Run Code Online (Sandbox Code Playgroud)

另外,如果您不想使用Response类,您可以从视图返回多个值

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

第一个值是响应的正文,第二个值是状态代码,最后一个值是响应的标头。