Python 为什么Django';s HTTPResponseRedirect对PUT而不是POST使用相同的HTTP方法?
我有一个Django项目,其中我使用一个视图来处理不同的HTTP方法。Python 为什么Django';s HTTPResponseRedirect对PUT而不是POST使用相同的HTTP方法?,python,django,http,http-status-code-301,http-status-code-302,Python,Django,Http,Http Status Code 301,Http Status Code 302,我有一个Django项目,其中我使用一个视图来处理不同的HTTP方法。POST处理了对象的创建,然后使用Django的redirect()快捷方式(HTTPResponseRedirect)返回新创建的对象,重定向到与GET相同的视图。这很有效。我用PUT尝试了同样的方法,但我陷入了重定向循环。在搔了一会儿脑袋之后,我无意中发现了,然后我推断,由于重定向不能处理POST数据,因此请求会变成GET 当我从POST执行重定向时,我通过查看日志确认了这一点: [15/Dec/2014 00:47:43
POST
处理了对象的创建,然后使用Django的redirect()
快捷方式(HTTPResponseRedirect
)返回新创建的对象,重定向到与GET
相同的视图。这很有效。我用PUT
尝试了同样的方法,但我陷入了重定向循环。在搔了一会儿脑袋之后,我无意中发现了,然后我推断,由于重定向不能处理POST
数据,因此请求会变成GET
当我从POST
执行重定向时,我通过查看日志确认了这一点:
[15/Dec/2014 00:47:43] "POST /client/151/ HTTP/1.1" 302 0
[15/Dec/2014 00:47:43] "GET /client/151/ HTTP/1.1" 200 395
然而,PUT
保持一个PUT
,并将我抛出一个重定向循环,直到它出错为止
[14/Dec/2014 23:07:36] "PUT /api/asset/6779 HTTP/1.1" 301 0
[14/Dec/2014 23:07:37] "PUT /api/asset/6779/ HTTP/1.1" 302 0
[14/Dec/2014 23:07:37] "PUT /api/asset/6779 HTTP/1.1" 301 0
[14/Dec/2014 23:07:38] "PUT /api/asset/6779/ HTTP/1.1" 302 0
[14/Dec/2014 23:07:38] "PUT /api/asset/6779 HTTP/1.1" 301 0
[14/Dec/2014 23:07:39] "PUT /api/asset/6779/ HTTP/1.1" 302 0
[14/Dec/2014 23:07:39] "PUT /api/asset/6779 HTTP/1.1" 301 0
[14/Dec/2014 23:07:40] "PUT /api/asset/6779/ HTTP/1.1" 302 0
[14/Dec/2014 23:07:40] "PUT /api/asset/6779 HTTP/1.1" 301 0
[14/Dec/2014 23:07:41] "PUT /api/asset/6779/ HTTP/1.1" 302 0
[14/Dec/2014 23:07:41] "PUT /api/asset/6779 HTTP/1.1" 301 0
[14/Dec/2014 23:07:42] "PUT /api/asset/6779/ HTTP/1.1" 302 0
重定向不应该使用GET
?我知道发生了什么但不知道为什么?有什么好处
编辑
# urls.py
url(r'^$', views.put_vs_post_redirect),
# views.py
from django.shortcuts import redirect
def put_vs_post_redirect(request, asset_id):
if request.method == 'GET':
return HTTPResponse('Get request')
elif request.method == 'POST':
return redirect('/')
elif request.method == 'PUT':
return redirect('/')
正如评论中提到的,这完全取决于客户端,并且并非所有客户端都以相同的方式处理重定向。您可以在堆栈溢出上找到和 当使用
301
(通常是302
)重定向时,大多数浏览器将丢弃POST
数据并发出GET
请求。这主要是因为浏览器总是这样做,而POST
请求通常来自web表单,因此重定向会导致GET
,从而允许浏览器在不干扰的情况下显示不同的页面。对于PUT
或PATCH
请求,情况并非如此,因为它们当前无法通过web表单发送,并且通常按照不同的规则播放
如果您想在<代码> 302 < /COD>重定向上维护<代码> POST >代码>数据,则应考虑。307
请求应维护请求方法,并因此维护请求正文
如果您希望在301
重定向中维护POST
数据,则当前有一种类似于307
的方法,但它是永久性的
您可以强制重定向使用带有的
GET
请求。它的工作原理非常类似于302
,但它强制要求请求方法始终是GET
请求。它通常在异步任务的API中使用。相关:您如何让用户代理执行PUT?从帖子获取的重定向是有意义的,因为您可以让浏览器使用POST(表单)浏览页面,但不能通过PUT。看起来您正在编写一个API。为什么不在200OK响应中将URI返回给创建的对象(或者只记录它在您放置它的位置),并让用户代理对此进行操作?此外,您还可以使用尾随斜杠发布帖子,而不使用尾随斜杠。“这是故意的吗?”安东说。谢谢您的解决方法是可以接受的,但我试图完成的是,当PUT完成时,我返回新对象,因此我重定向到GET,它是为给我一个对象而设计的。在这一点上,我有一个解决办法,但我更感兴趣的是弄清楚这是Django做的还是在HTTP级别做的。这是在HTTP级别做的,特别是在客户端实现中。回答得很好。感谢您的解释和建议的解决方案。