在用户提交一些数据来制作新对象后,我希望后端像往常一样将他重定向到对象详细信息:
我正在做类似的事情:
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
的响应不是中间步骤。
解决此问题的正确方法是什么?
答案 0 :(得分:4)
实际上,Flask正在按照RFC 2616 section 10.3.2
的定义在这里做正确的事情新的永久URI应该由位置字段给出 响应。除非请求方法是HEAD,否则的实体 响应应该包含一个带有超链接的短超文本注释 新的URI。
[强调我的]
引用RFC 2119,本段可以解释为:
HTTP服务器必须包含一个带有30X重定向的短超文本注释,除非他们有充分的理由避免这样做
使用浏览器或任何常见HTTP库的人都不会看到该页面 - 客户端将遵循RFC 2616相关部分中指定的Location
标头中提供的重定向。
Pendantic讲课除外,如果你正在构建一个JSON API并且除了状态代码和必要的头文件之外什么都不提供,你可以通过使用Flask.errorhandler
为适当的方法注册自己的错误处理程序来做到这一点。装饰者或Flask.register_error_handler
:
@app.errorhandler(302)
def minimal_redirect():
return u"", 302
答案 1 :(得分:2)
使用-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.
答案 2 :(得分:1)
您可以简单地删除redirect
响应的HTTP正文。
res = redirect(url_for('provider', provider_id=obj.id))
res.data = ""
return res
答案 3 :(得分:0)
我有类似的查询,因为烧瓶在重定向到目标本身之前已重定向到重定向页面。
只需删除code
即可解决问题。您还可以为每个code
指定自定义路由/处理程序。
redirect(url_for('home'), code=302)
到
redirect(url_for('home'))
或者就像@Sean Vieira指出的那样,使用此装饰器来处理重定向
@app.errorhandler(302)
def custom_redirect():
# Return template