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

时间:2014-03-26 18:05:17

标签: python flask

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

this post

的详细信息

1 个答案:

答案 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设置为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

但请注意,即使Flask没有,您的WSGI服务器仍然可以强制执行绝对URL。