如何使用Flask返回相对URI Location标头?

Gui*_*ent 8 python flask

在构建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进行回答.

这篇文章的更多细节

Mar*_*ers 7

HTTP RFC指明所述Location头部必须是绝对URI:

14.30位置

位置响应标头字段用于将接收方重定向到Request-URI以外的其他位置,以完成请求或标识新资源。对于201(已创建)响应,位置是请求创建的新资源的位置。对于3xx响应,位置应该指示服务器的首选URI,用于自动重定向到资源。字段值由单个绝对URI组成。

Location       = "Location" ":" absoluteURI
Run Code Online (Sandbox Code Playgroud)

这样,Flask / Werkzeug响应对象会将任何相对URL Location头转换为绝对URL。

可以重写此行为,尽管我不建议您这样做。要覆盖它,请将对象autocorrect_location_header属性Response设置为Falsejsonify()返回一个响应对象,改变它:

@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。

  • 在撰写此评论时,@ martijn-pieters并不需要绝对位置。>位置标头字段的语法已更改,以允许所有URI引用,包括相对引用和片段,以及一些有关何时不适合使用片段的说明。([第7.1.2节](https://tools.ietf.org/html/rfc7231#section-7.1.2))-源页面92 (7认同)