在构建HTTP响应时,Flask会替换我的Location标头的内容.它用绝对值改变我的实际相对URI Location标题.
@app.route('/votes', methods=['POST'])
def votes():
return jsonify(), 201, {'location': '/votes/1'}
Run Code Online (Sandbox Code Playgroud)
我的测试:
def test_vote_creation(self):
response = self.app.post('/votes',
data=json.dumps({
'name': 'Test vote'
}), content_type='application/json')
print(response.headers['location'])
Run Code Online (Sandbox Code Playgroud)
返回http://localhost/votes/1而不是/votes/1
如何使用Flask jsonify返回相对URI Location标头?
编辑:根据HTTP/1.1标准RFC 2616的当前版本,Location头的值必须是绝对URI.但RCF也将改为允许相对URI.因此,我想更改API的默认行为,以便在我的位置标头中使用相对URI进行回答.
这篇文章的更多细节
的HTTP RFC指明所述Location头部必须是绝对URI:
14.30位置
位置响应标头字段用于将接收方重定向到Request-URI以外的其他位置,以完成请求或标识新资源。对于201(已创建)响应,位置是请求创建的新资源的位置。对于3xx响应,位置应该指示服务器的首选URI,用于自动重定向到资源。字段值由单个绝对URI组成。
Run Code Online (Sandbox Code Playgroud)Location = "Location" ":" absoluteURI
这样,Flask / Werkzeug响应对象会将任何相对URL Location头转换为绝对URL。
您可以重写此行为,尽管我不建议您这样做。要覆盖它,请将对象的autocorrect_location_header属性Response设置为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
Run Code Online (Sandbox Code Playgroud)
但是请注意,即使Flask不能,您的WSGI服务器仍然可以强制使用绝对URL。
| 归档时间: |
|
| 查看次数: |
7138 次 |
| 最近记录: |