2

在用户提交一些数据以创建新对象后,我希望后端将他重定向到对象详细信息,像往常一样:

我正在做类似的事情:

if obj.is_valid():
    obj.save()
    flash('%s created' % obj, )
    return redirect(url_for('provider', provider_id=obj.id))

但是通过 curl 做 te 请求(我正在构建一个 API,用 curl 测试它)

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<title>Redirecting...</title>
<h1>Redirecting...</h1>
<p>You should be redirected automatically to target URL: <a href="/provider/11">/provider/11</a>.  If not click the link.
user@box

这很不幸,因为我只想要/provider/:id中间步骤的响应。

解决这个问题的正确方法是什么?

4

4 回答 4

4

实际上,Flask 在这里按照RFC 2616 第 10.3.2 节的定义做了正确的事情

新的永久 URI 应该由响应中的 Location 字段给出。除非请求方法是 HEAD,否则响应的实体应该包含一个简短的超文本注释,其中包含指向新 URI 的超链接。

[强调我的]

引用RFC 2119,本段可以解释为:

HTTP 服务器必须包含带有 30X 重定向的简短超文本注释,除非它们有充分的理由避免这样做

没有人使用浏览器或任何常见的 HTTP 库会看到该页面 - 客户端将遵循LocationRFC 2616 相关部分中指定的标头中提供的重定向。

抛开悬而未决的演讲不谈,如果您正在构建 JSON API,并且除了状态代码和必要的标头之外什么都不提供,您可以通过使用Flask.errorhandler装饰器或为适当的方法注册自己的错误处理程序来做到这一点Flask.register_error_handler

@app.errorhandler(302)
def minimal_redirect():
    return u"", 302
于 2012-07-31T01:31:44.717 回答
3

用于-L指示 curl 它应该遵循 HTTP 重定向,并且只显示最终响应:

$ curl -s http://www.exyr.org|grep '<title>' 
<title>301 Moved Permanently</title>
$ curl -s -L http://www.exyr.org|grep '<title>'
  <title>Exyr.org</title>

man curl

   -L, --location
          (HTTP/HTTPS)  If  the server reports that the requested page has
          moved to a different location (indicated with a Location: header
          and  a  3XX  response code), this option will make curl redo the
          request on the new place. If used together with -i, --include or
          -I, --head, headers from all requested pages will be shown. When
          authentication is used, curl only sends its credentials  to  the
          initial  host.  If a redirect takes curl to a different host, it
          won't be able to intercept the user+password. See  also  --loca‐
          tion-trusted  on how to change this. You can limit the amount of
          redirects to follow by using the --max-redirs option.

          When curl follows a redirect and the request is not a plain  GET
          (for example POST or PUT), it will do the following request with
          a GET if the HTTP response was 301, 302, or 303. If the response
          code  was  any  other  3xx code, curl will re-send the following
          request using the same unmodified method.
于 2012-07-31T09:16:58.120 回答
1

我有类似的查询,因为烧瓶在重定向到目的地本身之前重定向到重定向页面。

只是删除code实际解决了问题。您还可以为每个code.

redirect(url_for('home'), code=302)

至,

redirect(url_for('home'))

或者正如@Sean Vieira 指出的那样,使用这个装饰器来处理重定向

@app.errorhandler(302)
def custom_redirect():
    # Return template
于 2019-05-28T05:04:48.463 回答
0

您可以简单地删除redirect响应的 HTTP 正文。

res = redirect(url_for('provider', provider_id=obj.id))
res.data = ""
return res
于 2012-07-30T19:31:47.677 回答