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"
具有以下 curl
:
curl 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.headers
是 werkzeug.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。
我希望我的 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"
具有以下 curl
:
curl 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.headers
是 werkzeug.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。