У меня есть проект Django, где я использую представление для обработки различных HTTP-методов. POST
обрабатывал создание объекта, а затем перенаправлялся на тот же вид, что и GET
(или так я думал), используя Django redirect()
shortcut (HTTPResponseRedirect
), чтобы вернуть вновь созданный объект. Это отлично работает. Я пробовал то же самое с PUT
, но я попал в цикл перенаправления. Некоторое время царапая голову, я наткнулся на этот ответ SO, а затем я предположил, что, поскольку перенаправление не обрабатывает данные 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
остается a 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('/')