2009-11-23 12 views
11

Si quiero dar una opción para que los usuarios inicien sesión en un sitio web utilizando https:// en lugar de http://, lo mejor será que les dé una opción para llegar allí en mi vista o plantilla.Django - enlaces generados con {% url%} - cómo hacerlos seguros?

Me gustaría tener el enlace "Usar conexión segura" en mi página de inicio de sesión, pero entonces, ¿cómo lo hago sin codificar el URL?

Me gustaría ser capaz de simplemente hacer:

{% url login_page %} 
{% url login_page_https %} 

y hacer que se apuntan a http://example.com/login y https://example.com/login.

¿Cómo puedo hacer esto?

+0

Curiosamente, sin embargo, ¿por qué cualquier usuario que desee acceder a través de un HTTP cuando https ¿está disponible? – Randell

+1

Debido a que su proxy solo permite el acceso al puerto 80 (visto esta aberración varias veces) – Kos

Respuesta

0

Quizás podría escribir una etiqueta url_https que haga lo mismo que url pero apunta a la versión HTTPS de la url.

6

No he trabajado mucho con URL seguras, pero he trabajado un poco con satchmo, que tiene un middleware y algunos utils para él. El middleware simplemente comprueba la clave SSL = True en los parámetros de vista y hace que la solicitud sea segura de esa manera. Probablemente no necesite hacerlo tan complejo, pero puede ver cómo se implementa.

Satchmo está en bitbucked here

yo también era capaz de encontrar un fragmentos de middleware que también debe ser capaz de ayudarle a obtener una URL de acceso seguro:

La primera es la original, mientras que la segunda debe ser una versión mejorada, en algún momento, pero quizás ya no sea el caso. Puedes echarles un vistazo.

Utilizando cualquiera satchmo o uno de los fragmentos de middleware que debería ser capaz de hacer algo como

{% url login_page %} 
{% url login_page SSL=1 %} 
+0

Los fragmentos enlazados son una buena solución integral si desea definir ciertas URL como https solamente y luego tener un middleware que se encargue de ello. Son exagerados si todo lo que intenta hacer es crear un enlace https. –

+0

Es cierto, para un solo enlace, esto no vale la pena. En ese caso, tu solución es mejor. – googletorp

18

La etiqueta {% url %} sólo genera la parte de ruta de la URL, no la parte del host. Solo genera algo como "/ ruta/hacia/aquí" (todo lo que necesita hacer es "ver fuente" y verá que es todo el contenido del href). Es su navegador el que asume que si actualmente está en http://example.com, el enlace también debe estar dentro de http://example.com. Así que todo lo que necesita hacer para generar un enlace seguro en su plantilla es:

<a href="https://example.com{% url blah %}"> 

Si no desea codificar el nombre de dominio (y yo no), puede utilizar the Site object y tienen un aspecto algo así como:

<a href="https://{{ site.domain }}{% url blah %}"> 

O si no desea utilizar el marco sitios, puede utilizar request.get_host:

<a href="https://{{ request.get_host }}{% url blah %}"> 
+0

Esto tiene 1 desventaja; cuando/si muevo el sitio a un dominio diferente, o algo así, las URL relativas no se romperán, esta sí lo hará. Estaba buscando algo más parecido a la función request.build_absolute_uri() con la opción de reemplazar http por https, pero supongo que es mejor implementarlo solo. – kender

+0

Bueno, no hay forma de forzar https y usar una URL relativa. Editado para mencionar que puede usar el framework Sites para evitar codificar el nombre de dominio. –

+0

La opción anterior que utiliza request.get_host básicamente está haciendo lo mismo que request.get_absolute_uri y forzando https. –

Cuestiones relacionadas