【问题标题】:How to return a relative URI Location header with Flask?如何使用 Flask 返回相对 URI Location 标头?
【发布时间】:2014-05-05 08:29:48
【问题描述】:

Flask 在构建我的 HTTP 响应时替换了我的 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 Location 标头?

编辑:根据当前版本的 HTTP/1.1 标准 RFC 2616,Location 标头的值必须是 an absolute URI。 但是 RCF 也将更改为允许相对 URI。所以我想更改我的 API 的默认行为,以在我的位置标头中使用相对 URI 进行回答。

更多详情this post

【问题讨论】:

  • 你到底想做什么?抱歉,您的帖子至少对我来说不是很清楚
  • @codegeek 我编辑了我的问题,我希望这更清楚
  • 这在 Github 上的 werkzeug issue 中进行了讨论。

标签: python flask werkzeug


【解决方案1】:

HTTP RFC 指定 Location 标头必须是绝对 URI:

14.30 地点

Location 响应头字段用于重定向收件人 到 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。

【讨论】:

  • 感谢@martijn-pieters 的解释。我知道 RFC。我只是想知道是否有解决方案,因为 RFC 将会改变。但现在我将更改我的前端以处理绝对 URI。
  • @martijn-pieters 在撰写此评论时,位置不需要是绝对的。 > Location 标头字段的语法已更改,以允许所有 URI 引用,包括相对引用和片段,以及关于何时不适合使用片段的一些说明。 (Section 7.1.2) - 源页面 92
  • @cianmce 所以我认为当前的答案是“Flask 尚不支持”?
  • 这里是更新的 RFC:tools.ietf.org/html/rfc7231 -- 它允许相对路径。
猜你喜欢
  • 2012-09-08
  • 1970-01-01
  • 2021-11-12
  • 2016-12-25
  • 2014-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-03
相关资源
最近更新 更多