Python 为什么Django';s HTTPResponseRedirect对PUT而不是POST使用相同的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

我有一个Django项目,其中我使用一个视图来处理不同的HTTP方法。
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级别做的,特别是在客户端实现中。回答得很好。感谢您的解释和建议的解决方案。