Python 在不呈现重定向页面的情况下进行重定向

Python 在不呈现重定向页面的情况下进行重定向,python,redirect,flask,Python,Redirect,Flask,在用户提交一些数据以创建新对象后,我希望后端像往常一样将其重定向到对象详细信息: 我在做一些事情,比如: if obj.is_valid(): obj.save() flash('%s created' % obj, ) return redirect(url_for('provider', provider_id=obj.id)) 但是通过curl执行te请求(我正在构建一个API,用curl测试它) 重定向。。。 重定向。。。 您应该自动重定向到目标URL:。如果

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

我在做一些事情,比如:

if obj.is_valid():
    obj.save()
    flash('%s created' % obj, )
    return redirect(url_for('provider', provider_id=obj.id))
但是通过curl执行te请求(我正在构建一个API,用curl测试它)


重定向。。。
重定向。。。
您应该自动重定向到目标URL:。如果没有,请单击链接。
user@box
这很不幸,因为我只需要
/provider/:id
的响应,而不是中间步骤


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

您可以简单地删除
重定向
响应的HTTP正文

res = redirect(url_for('provider', provider_id=obj.id))
res.data = ""
return res

实际上,Flask在这里做的事情是正确的,定义如下

新的永久URI应该由 答复。除非请求方法是HEAD,否则 响应应包含一个简短的超文本注释,并带有指向的超链接 新的URI

[我的重点]

引用,本段可解释为:

HTTP服务器必须包含带有30倍重定向的简短超文本说明,除非它们有很好的理由避免这样做

任何使用浏览器或任何通用HTTP库的人都不会看到该页面-客户机将按照RFC 2616相关章节中规定的
位置
标题中提供的重定向进行操作

抛开Pendantic的演讲不谈,如果您正在构建JSON API,并且除了状态代码和必要的头之外不想提供任何服务,那么您可以通过使用decorator为适当的方法注册自己的错误处理程序来实现这一点:


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

$curl-shttp://www.exyr.org|格雷普“
301永久搬迁
$curl-s-Lhttp://www.exyr.org|格雷普“
Exyr.org
男子卷发中

-L,--location
(HTTP/HTTPS)如果服务器报告请求的页面
移动到其他位置(用位置:标题指示
和3XX响应代码),此选项将使curl重做
对新地方的要求。如果与-i,--一起使用,则包括或
-一、 --标题,将显示所有请求页面的标题。什么时候
使用身份验证时,curl仅将其凭据发送到
初始主机。如果重定向将curl转移到其他主机,则
将无法拦截用户+密码。另见——失水事故
我不知道如何改变这一点。你可以限制食物的数量
使用--max redirs选项重定向到follow。
当curl遵循重定向并且请求不是简单的GET时
(例如POST或PUT),它将使用
如果HTTP响应为301、302或303,则返回GET。如果回答是
代码是任何其他3xx代码,curl将重新发送以下内容
使用相同的未修改方法进行请求。

我有类似的查询,因为flask在重定向到目的地之前重定向到了重定向页面

仅仅删除
代码
实际上就解决了问题。您还可以为每个
code
指定自定义路由/处理程序

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

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

@app.errorhandler(302)
def custom_redirect():
    # Return template

如果不希望服务器发送重定向页面,则根本不希望使用重定向。调用直接呈现
/provider/11
页面的方法。请注意,如果您这样做,浏览器URL将显示他们最初点击的任何地址(而不是
/provider/11
),刷新页面将再次点击该地址。不,我需要重定向,而不是直接调用方法。。。Django的重定向正确地完成了任务…@tutaca“正确地”对不同的人意味着不同的事情。你是说HTTP 302()?当您使用上面的代码时,这就是Flask应该已经设置的内容。您没有给我们响应页面附带的HTTP头…伙计。。。事情是做一个普通的重定向(只需阅读代码),这是flask默认的302(文档中这么说)。。。正确的意思是在我没有要求时不生成html…不,这只会返回一个空白响应。。。我需要最终的url响应(在本例中为“/provider/11”)
redirect(url_for('home'), code=302)
redirect(url_for('home'))
@app.errorhandler(302)
def custom_redirect():
    # Return template