Django: как перенаправить сообщение и передать данные сообщения
при обработке запроса POST в Django views.py файл, мне иногда нужно перенаправить его на другой url. Этот url, на который я перенаправляю, обрабатывается другой функцией в том же Django views.py файл. Есть ли способ сделать это и сохранить исходные данные POST?
обновление: больше объяснений, почему я хочу это сделать.
У меня есть два веб-приложения (назовем их AppA и AppB), которые принимают данные, введенные в текстовое поле пользователем. Когда пользователь нажимает кнопку Отправить, данные обрабатываются и отображаются подробные результаты. APPA и Аппб ожидать различные типы данных. Иногда пользователь ошибочно отправляет данные типа AppB в AppA. Когда это произойдет, я хочу перенаправить их в AppB и показать результаты AppB или, по крайней мере, заполнить их данными, которые они ввели в AppA.
также:
клиент хочет два отдельных приложения, а не объединять их в одну.
Я не могу показать код, как это принадлежит клиенту.
обновление 2:
Я решил, что поцелуй-это лучший принцип здесь. Я объединил два приложения в одно, что делает вещи проще и надежнее; я должен быть в состоянии убедить клиента, что это лучший способ пойти тоже. Спасибо за все отличные отзывы. Если бы я собирался поддерживать два приложения, как описано, то я думаю, что сеансы будут способом сделать это - спасибо Мэтью Дж Моррисону за это предложение. Благодаря Dzida как его замечания у меня думая о дизайне и упрощении.
7 ответов:
Если вы столкнулись с такой проблемой есть небольшой шанс, что вы, возможно, должны пересмотреть свой дизайн.
это ограничение HTTP, что данные POST не могут идти с перенаправлениями.
можете ли вы описать, что вы пытаетесь достичь, и, возможно, тогда мы сможем подумать о каком-то аккуратном решении.
Если вы не хотите использовать сеансы, как предложил Мэтью, вы можете передать параметры POST В GET to the new page (рассмотрим некоторые ограничения, такие как безопасность и максимальная длина GET params в строке запроса).
обновить до вашего обновления:) Мне кажется странным, что у вас есть 2 веб-приложения, и эти приложения используют один views.py (я прав?). В любом случае рассмотрите возможность передачи ваших данных из POST в GET в правильное представление (в случае, если данные не чувствительны, конечно).
Я думаю, что, вероятно, я бы справился с этой ситуацией, чтобы сохранить данные post в сеансе, а затем удалить его, когда он мне больше не нужен. Таким образом, я могу получить доступ к исходным данным post после перенаправления, даже если этот пост исчез.
будет ли это работать для того, что вы пытаетесь сделать?
вот пример кода того, что я предлагаю: (имейте в виду, что это непроверенный код)
def some_view(request): #do some stuff request.session['_old_post'] = request.POST return HttpResponseRedirect('next_view') def next_view(request): old_post = request.session.get('_old_post') #do some stuff using old_postеще одна вещь, чтобы иметь в виду... если вы делаете это, а также загружая файлы, я бы не стал делать это таким образом.
вы должны использовать HTTP 1.1 временное перенаправление (307).
К Сожалению, Джанго
redirect()иHTTPResponseRedirect(постоянный) возврат только 301 или 302. Вы должны реализовать его самостоятельно:from django.http import HttpResponse, iri_to_uri class HttpResponseTemporaryRedirect(HttpResponse): status_code = 307 def __init__(self, redirect_to): HttpResponse.__init__(self) self['Location'] = iri_to_uri(redirect_to)см. также Джанго.модуль http.
Edit:
в последних версиях Django, изменить
iri_to_uriимпорт в:from django.utils.encoding import iri_to_uri
использовать
requestsпакета.Его очень легко реализоватьpip install requestsтогда вы можете вызывать любые URL-адреса с любым методом и передавать данные
в ваших представлениях запросы на импорт
import requestsчтобы разместить данные, следуйте формату
r = requests.post('http://yourdomain/path/', data = {'key':'value'})чтобы получить абсолютный url в представлении django, используйте
request.build_absolute_uri(reverse('view_name'))таким образом, код представления django выглядит как
r = requests.post( request.build_absolute_uri(reverse('view_name')), data = {'key':'value'} )здесь
rявляется ли объект ответа сstatus_codeи .r.status_codeдает код состояния(на успех это будет 200) иr.contentдает тело ответа. Существует метод json (r.json()), который преобразует ответ в формат json
просто вызовите новое представление из старого представления, используя тот же объект запроса. Конечно, это не приведет к перенаправлению как таковому, но если все, что вас волнует, - это "передача" данных из одного представления в другое, тогда это должно работать.
Я протестировал следующий код и он работает.from django.views.generic import View class MyOldView(View): def post(self, request): return MyNewView().post(request) class MyNewView(View): def post(self, request): my_data = request.body print "look Ma; my data made it over here:", my_data
можно использовать оказать и контекст С этого:
Render(request,"your template path", {'vad name' : var value}вы можете получить vars в шаблоне:
{% If var name %} {{ var name }} {% endif %}
если вы используете перенаправление после обработки сообщения в
AppB, вы действительно можете уйти с вызовомAppBметодAppAметод.Пример:
def is_appa_request(request): ## do some magic. return False or True is_appb_request = is_appa_request def AppA(request): if is_appb_request(request): return AppB(request) ## Process AppA. return HttpResponseRedirect('/appa/thank_you/') def AppB(request): if is_appa_request(request): return AppA(request) ## Process AppB. return HttpResponseRedirect('/appb/thank_you/')это должно дать прозрачный опыт для конечного пользователя, и клиент, который нанял вас, вероятно, никогда не будет знать разницы.
если вы не перенаправляете после публикации, не беспокоитесь о дублировании данных из-за обновления страницы пользователем?
Comments