在构建HTTP响应时,Flask会替换我的Location标头的内容。 它用绝对值改变我的实际相对URI Location标题。
@app.route('/votes', methods=['POST'])
def votes():
return jsonify(), 201, {'location': '/votes/1'}
我的测试:
def test_vote_creation(self):
response = self.app.post('/votes',
data=json.dumps({
'name': 'Test vote'
}), content_type='application/json')
print(response.headers['location'])
返回http://localhost/votes/1
而不是/votes/1
如何使用Flask jsonify返回相对URI位置标题?
编辑:根据HTTP / 1.1标准RFC 2616的当前版本,Location标头的值必须为an absolute URI。 但RCF也将改为允许相对URI。所以我想更改我的API的默认行为,以便在我的位置标题中使用相对URI进行回答。
的详细信息答案 0 :(得分:4)
HTTP RFC指定Location
标题必须为绝对URI:
14.30位置
Location response-header字段用于重定向收件人 到Request-URI以外的位置以完成请求 或识别新资源。对于201(创建)的回复, 位置是请求创建的新资源的位置。 对于3xx响应,位置应该表明服务器的首选 自动重定向到资源的URI。字段值 由一个绝对URI组成。
Location = "Location" ":" absoluteURI
因此,Flask / Werkzeug响应对象将任何相对URL Location
标头转换为绝对URL。
您可以覆盖此行为,但我不建议您这样做。要覆盖它,请将autocorrect_location_header
attribute of a Response
object设置为False
。 jsonify()
返回一个响应对象,改变:
@app.route('/votes', methods=['POST'])
def votes():
response = jsonify()
response.status_code = 201
response.headers['location'] = '/votes/1'
response.autocorrect_location_header = False
return response
但请注意,即使Flask没有,您的WSGI服务器仍然可以强制执行绝对URL。