2009-08-28 40 views
16

Estoy tratando de crear un redireccionamiento en una vista de Django a una url externa con algunos parámetros de obtención asociados a la solicitud. Después de mirar y probar, parece que he chocado contra un obstáculo.External django redirigir con los parámetros POST

Así que mi vista se ve algo como esto

def view(request): 
    data = get.data(request) 
    if something in data: 
     return HttpResponseRedirect('example.com') 

Esto es por lo que yo era capaz de conseguir. Sé que en la solicitud de URL puede especificar algunos parámetros pongo así:

... 
return HttpResponseRedirect('example.com?name=smith&color=brown') 

Sin embargo, ya que algunos de los datos son sensibles, no quiero que termine en la url. Dado que es una URL externa, no puedo usar el acceso directo redirect() que acepta parámetros de vistas. Entonces, ora, ¿cómo se puede lograr tal tarea?

Editar

después de haber hecho un poco más mirando a su alrededor, y han charlado un poco en el IRC, parece que lo que debería hacer, para mantener el parámetro de alejarse de los usuarios, que contiene la información de pago, es enviarlos como publicación en su lugar. Me dijeron que deberías poder hacerlo usando algunos JS también, posiblemente jQuery. La pregunta sigue siendo, aunque un poco más complicada ahora. ¿Cómo se puede crear una redirección de publicaciones en django con la ayuda de javascript?

segunda edición

parece que se me ha informado mal. Gracias por aclarar eso con los protocolos de redirección DR. Parece que he estado yendo por el camino equivocado en mi intento de usar la redirección para resolver este problema.

Respuesta

18

Sugiero el siguiente enfoque. En su vista/plantilla de Django, devuelva el formulario al navegador con todos los parámetros que desea publicar como elementos de formulario ocultos. Tan pronto como se cargue el formulario, JavaScript enviará el formulario (POST) al lugar que desee.

Vista:

from django.shortcuts import render_to_response 

def view(request): 
    return render_to_response('test.html', { 'foo': 123, 'bar': 456 }) 

Plantilla:

<html> 
<head> 
    <title>test</title> 
    <script type="text/javascript"> 
    function load() 
    { 
      window.document.test.submit(); 
      return; 
    } 
    </script> 
</head> 
<body onload="load()"> 
<form name="test" method="post" action="http://www.example.com"> 
    <input type="hidden" name="foo" value={{ foo }} /> 
    <input type="hidden" name="bar" value={{ bar }} /> 
</form> 
</body> 
</html> 
+0

Esa es una forma inteligente de evitar la redirección. Sin embargo, esto es dependiente de JavaScript, por lo que necesitaría hacer una degradación elegante también. Me pregunto qué tan fácil será esto en la práctica, teniendo que cargar la página antes de poder hacer la publicación js. – googletorp

+0

Sí, esta solución depende de que JavaScript esté habilitado en el navegador, pero eso no significa que deba hacerlo en esta página. Debería comprobar si hay JavaScript antes de llegar a su punto de vista. De modo que si no está habilitado, el usuario ni siquiera llegaría tan lejos. En cuanto a la carga de la página, dependerá de qué tan rápido regrese su vista, y qué tan grande es el resultado HTML. Si solo tiene un par de campos, el renderizado de la página supongo que sería en menos de un segundo. La redirección también es rápida, por lo que la experiencia del usuario con esta solución es muy similar a la de un redireccionamiento normal. –

+0

Pero, ¿cuáles son las implicaciones de seguridad de tal solución? Quiero enviar los parámetros a una pasarela de pago. ¿Está seguro el envío de datos confidenciales como mi auth_id, etc. al usuario? ¿No hay otra manera? – sudshekhar

9

Los parámetros GET siempre van en la URL, eso es lo que los convierte en parámetros GET.

No se puede redireccionar utilizando los parámetros POST (que no aparecen en la URL): esta es una restricción de HTTP, no de Django.

+0

¿Eso significa que no es posible redirigir a un sitio de pago/ventana, sin que el usuario pueda ver todos los datos que se envían? – googletorp

2

No estoy de acuerdo con Daniel, hay una manera de evitar la limitación de redirigir HTTP únicamente con parametros GET. lo que estoy pensando es:

  1. Redirigir a un destino GET con los parámetros que desee.
  2. En la página GET, configure un formulario con los parámetros que reenvió
  3. Auto envíe el formulario.

Eso es lo que hacen la mayoría de los servicios de descarga de archivos y, a veces incluso las páginas de pago (Paypal y tal). de hecho es un poco feo (1 salto más) pero tiene sus propios beneficios.

+0

Auto envíe el formulario. ¿Puedes por favor elaborar ese paso? Gracias. – Clayton

+1

por supuesto. '' ' $ (document) .ready (function() { $ (" # your_form "). Submit(); }) ' '' –