Как я могу перенаправить после POST в пирамиде? - PullRequest
19 голосов
/ 10 апреля 2011

Я пытаюсь отправить форму на маршрут, который проверит данные и перенаправит обратно на исходный маршрут.

Например:

  • Пользователь загружает страницу website.com/post
  • Форма отправляет данные на website.com/post-save
  • Пользователь перенаправляется обратно на website.com/post

Пирамида доставляет мне некоторые неприятности при этом.

Вот мои похудевшие views.py

def _get_link_form(post_data):
    """ Returns the initialised form object """

    return LinkForm(post_data)

def home_page(request):

    form = _get_link_form(request.POST)
    return {'form' : form}

def save_post(request):
    """ form data is submitted here """"

    form = _get_link_form(request.POST)

    if not form.validate():
        return home_page(request, form)

Это код, с которым я играл. Мало того, что это не работает, это также чувствует себя грязным и взломанным. Конечно, есть более простой способ «перенаправить после POST» в Пирамиде?

Ответы [ 6 ]

27 голосов
/ 13 апреля 2011

Вашу проблему легче всего решить, просто отправив POST по тому же URL-адресу, на котором показана ваша форма, и просто перенаправив пользователя со страницы, когда POST успешен. Таким образом, пока форма не будет успешно отправлена, вы не меняете URL.

Если вы просто умираете от POST по другому URL-адресу, вам нужно сохранить данные с помощью сеансов, поскольку вы, очевидно, обрабатываете данные формы между запросами.

Обычно, если вы хотите обрабатывать ошибки в формах, вы используете сеанс и флэш-сообщения. Чтобы сделать это, вы просто добавляете место для появления флеш-сообщений в базовом шаблоне и настраиваете поддержку сеанса, используя что-то вроде pyramid_beaker.

Предполагается, что ваша домашняя страница настроена на «home» named-route:

from pyramid.httpexceptions import HTTPFound

def myview(request):
    user = '<default user field value>'
    if 'submit' in request.POST:
        user = request.POST.get('user')
        # validate your form data
        if <form validates successfully>:
            request.session.flash('Form was submitted successfully.')

            url = request.route_url('home') 
            return HTTPFound(location=url)
    return {
        # globals for rendering your form
        'user': user,
    }

Обратите внимание, что если форма не проходит проверку, вы используете тот же код, который вы использовали для первоначального отображения формы, и только в случае успеха вы перенаправляете. Этот формат также может обрабатывать заполнение формы значениями, используемыми при отправке, и значениями по умолчанию.

Вы можете просматривать флэш-сообщения в выбранном вами шаблоне, используя request.session.peek_flash() и request.session.pop_flash().

route_url также поддерживает изменение строки запроса в сгенерированном URL, если вы хотите пометить представление домашней страницы, чтобы проверить данные сеанса.

Очевидно, что вы можете просто передать все в строке запроса обратно на домашнюю страницу, но это довольно большая уязвимость безопасности, от которой сеансы могут помочь защитить.

8 голосов
/ 10 апреля 2011

Документация Pyramid имеет специальную секцию со следующим примером:

from pyramid.httpexceptions import HTTPFound

def myview(request):
    return HTTPFound(location='http://example.com')
1 голос
/ 03 декабря 2016

Документация Pyramid содержит информацию о Redirect , более подробную информацию вы можете получить по ссылке ниже:

Документация по пирамиде

import pyramid.httpexceptions as exc
raise exc.HTTPFound(request.route_url("section1"))   # Redirect
0 голосов
/ 09 апреля 2012

Чистым способом является использование «перегрузки», предоставляемой пирамидой для разных типов запросов, например, вы можете украсить свои методы следующим образом:

@action(request_method='GET',
        renderer='mypackage:/templates/save.mako',
        name='save')
def save(request):
    ''' Fill the template with default values or leave it blank'''
     return {}


@action(request_method='POST',
        renderer='mypackage:/templates/save.mako',
        name='save')
def save_post(request):
    """ form data is submitted here """"
    # process form

В HTML вы должны вызвать форму действия, как

<form method="POST" id="tform" action="${request.route_url('home', action='save')}">

Таким образом, один метод обрабатывается при использовании метода POST, а другой - при использовании GET.То же самое имя , но две реализации.

0 голосов
/ 15 апреля 2011

Я делаю это так:

from pyramid.httpexceptions import HTTPCreated

response = HTTPCreated()
response.location = self.request.resource_url( newResource )
return response

Отправляет созданный HTTP-код, 201

.
0 голосов
/ 12 апреля 2011

Предполагая, что ваша домашняя страница является представлением по умолчанию для вашего веб-приложения-пирамиды, вы можете сделать:

def _get_link_form(post_data):
    """ Returns the initialised form object """

    return LinkForm(post_data)

def home_page(request):

    form = _get_link_form(request.POST)
    return {'form' : form}

def save_post(request):   
    form = _get_link_form(request.POST)

    if not form.validate():
        from pyramid.httpexceptions import HTTPFound
        return HTTPFound(location=request.application_url)

По сути, вам необходимо знать, как представление домашней страницы было "добавлено" в ваш конфигуратор.Если ваша домашняя страница на самом деле находится на / немногих / уровнях / глубине / домашней странице, то перенаправление может выглядеть следующим образом:

        return HTTPFound(location=request.application_url + '/few/levels/deep/homepage')
...