python post redirect pylons pyramid

python - ¿Cómo puedo redireccionar después de POST en Pyramid?



redirect pylons (6)

Estoy intentando que mi formulario se envíe a una ruta que validará los datos y luego redireccionará a la ruta original.

Por ejemplo:

  • El usuario carga la página website.com/post
  • El formulario envía los datos a website.com/post-save
  • El usuario es redirigido de nuevo a website.com/post

Pirámide me está dando algunos problemas para hacer esto.

Aquí está mi vista reducida.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)

Este es el código con el que he estado jugando. No solo no funciona, también se siente desordenado y pirateado. ¿Seguramente hay una forma más sencilla de ''redirigir después de POST'' en Pyramid?


Hago esto así

from pyramid.httpexceptions import HTTPCreated response = HTTPCreated() response.location = self.request.resource_url( newResource ) return response

Esto envía el código HTTP creado, 201


La documentación de Pyramid tiene contenido sobre Redirect , puede ver más información en el siguiente enlace:

Documentación piramidal

import pyramid.httpexceptions as exc raise exc.HTTPFound(request.route_url("section1")) # Redirect


La documentación de Pyramid tiene una section particularmente puntual con el siguiente ejemplo:

from pyramid.httpexceptions import HTTPFound def myview(request): return HTTPFound(location=''http://example.com'')


Su problema se resuelve más fácilmente simplemente enviando la POST a la misma URL en la que se muestra su formulario, y simplemente redirigiendo al usuario fuera de la página cuando el POST es exitoso. De esa forma, hasta que el formulario no se envíe correctamente, no cambiará las URL.

Si simplemente está muriendo por POST a una URL diferente, entonces necesita guardar los datos mediante sesiones, ya que obviamente está manejando los datos del formulario entre las solicitudes.

Normalmente, si desea poder manejar los errores en sus formularios, usará una sesión y mensajes flash. Para hacer esto, simplemente agregue una ubicación para que aparezcan mensajes flash en su plantilla base y soporte de sesión de configuración usando algo como pyramid_beaker.

Suponiendo que su página de inicio esté configurada en la ruta denominada "inicio":

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, }

Observe que si el formulario no puede validar, usa el mismo código que hizo para procesar el formulario originalmente, y solo si es exitoso redirige. Este formato también puede manejar el llenado del formulario con los valores utilizados en el envío y los valores predeterminados.

Puede recorrer los mensajes flash en su plantilla de elección usando request.session.peek_flash() y request.session.pop_flash() .

route_url admite la mutación de la cadena de consulta en la url generada, si desea marcar la vista de su página de inicio para verificar los datos de la sesión.

Obviamente, puede pasar todo el contenido de la cadena de consulta a la página de inicio, pero esa es una vulnerabilidad de seguridad bastante grande contra la que las sesiones pueden ayudar a protegerse.


Suponiendo que su página de inicio es la vista predeterminada de su aplicación web de pirámide, puede hacer:

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)

Básicamente, necesita saber cómo se "agregó" la vista de página de inicio a su Configurador. Si su página de inicio realmente se encuentra en / few / levels / deep / homepage, entonces una redirección podría tener este aspecto:

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


Una forma limpia es usar la "sobrecarga" proporcionada por pirámide para diferentes tipos de solicitud, por ejemplo, puede decorar sus métodos de esta manera:

@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

En el HTML, debe llamar al formulario de acción, como

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

De esta manera, un método se procesa cuando se usa el método POST y el otro cuando se usa el GET. El mismo nombre , pero dos implementaciones.