Django: как перенаправить сообщение и передать данные сообщения



при обработке запроса POST в Django views.py файл, мне иногда нужно перенаправить его на другой url. Этот url, на который я перенаправляю, обрабатывается другой функцией в том же Django views.py файл. Есть ли способ сделать это и сохранить исходные данные POST?



обновление: больше объяснений, почему я хочу это сделать.
У меня есть два веб-приложения (назовем их AppA и AppB), которые принимают данные, введенные в текстовое поле пользователем. Когда пользователь нажимает кнопку Отправить, данные обрабатываются и отображаются подробные результаты. APPA и Аппб ожидать различные типы данных. Иногда пользователь ошибочно отправляет данные типа AppB в AppA. Когда это произойдет, я хочу перенаправить их в AppB и показать результаты AppB или, по крайней мере, заполнить их данными, которые они ввели в AppA.



также:




  • клиент хочет два отдельных приложения, а не объединять их в одну.


  • Я не могу показать код, как это принадлежит клиенту.



обновление 2:
Я решил, что поцелуй-это лучший принцип здесь. Я объединил два приложения в одно, что делает вещи проще и надежнее; я должен быть в состоянии убедить клиента, что это лучший способ пойти тоже. Спасибо за все отличные отзывы. Если бы я собирался поддерживать два приложения, как описано, то я думаю, что сеансы будут способом сделать это - спасибо Мэтью Дж Моррисону за это предложение. Благодаря Dzida как его замечания у меня думая о дизайне и упрощении.

747   7  

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

    Ничего не найдено.