¿Cómo obtengo el nombre de dominio de mi sitio actual desde una plantilla de Django? He intentado buscar en la etiqueta y los filtros, pero no hay nada allí.
python
django
django-templates
Jean-François Fabre
fuente
fuente
request.META['HTTP_HOST']
te da el dominio En una plantilla sería{{ request.META.HTTP_HOST }}
.Host:
encabezado y obtiene una respuesta con el dominio falsificado en algún lugar de una página, ¿cómo crea eso un agujero de seguridad? No veo cómo eso difiere de que un usuario tome el HTML generado y se modifique antes de alimentarlo a su propio navegador.Si desea el encabezado del host HTTP real, vea el comentario de Daniel Roseman sobre la respuesta de @ Phsiao. La otra alternativa es que si está utilizando el marco contrib.sites , puede establecer un nombre de dominio canónico para un Sitio en la base de datos (asignar el dominio de solicitud a un archivo de configuración con el SITE_ID adecuado es algo que debe hacer usted mismo a través de su configuración del servidor web). En ese caso estás buscando:
tendría que poner el objeto current_site en un contexto de plantilla usted mismo si desea usarlo. Si lo está utilizando por todas partes, puede empaquetarlo en un procesador de contexto de plantilla.
fuente
SITE_ID
configuración sea igual alid
atributo del sitio actual en la aplicación Sitios (puede encontrarloid
en el panel de administración de Sitios). Cuando llamasget_current
, Django toma tuSITE_ID
y devuelve elSite
objeto con esa identificación de la base de datos.print("get_current_site: ", get_current_site(request)) print("absolute uri: ", request.build_absolute_uri()) print("HTTP_HOST: ", request.META['HTTP_HOST']) get_current_site: localhost:8001 absolute uri: http://localhost:8001/... HTTP_HOST: localhost:8001
He descubierto el
{{ request.get_host }}
método.fuente
HTTP_X_FORWARDED_HOST
encabezado HTTP.request.build_absolute_uri
( docs.djangoproject.com/en/dev/ref/request-response/… )Complementando a Carl Meyer, puede hacer un procesador de contexto como este:
module.context_processors.py
configuración local.py
settings.py
plantillas que devuelven la instancia de contexto, el sitio de URL es {{SITE_URL}}
puede escribir su propia rutina si desea manejar subdominios o SSL en el procesador de contexto.
fuente
La variación del procesador de contexto que uso es:
El
SimpleLazyObject
contenedor se asegura de que la llamada a la base de datos solo ocurra cuando la plantilla realmente use elsite
objeto. Esto elimina la consulta de las páginas de administración. También almacena en caché el resultado.e inclúyelo en la configuración:
En la plantilla, puede usar
{{ site.domain }}
para obtener el nombre de dominio actual.editar: para admitir el cambio de protocolo también, use:
fuente
SimpleLazyObject
aquí, porque de todos modos no se llamará a lambda si nada accede al "sitio".SimpleLazyObject
, cadaRequestContext
llamaráget_current_site()
y, por lo tanto, ejecutará una consulta SQL. El contenedor se asegura de que la variable solo se evalúe cuando realmente se usa en la plantilla.SimpleLazyObject
está ahí para evitar la re-evaluación de la función, que no es realmente necesario ya que elSite
se almacena en caché de objetos.from django.contrib.sites.shortcuts import get_current_site
Sé que esta pregunta es antigua, pero me topé con ella buscando una forma pitónica para obtener el dominio actual.
fuente
build_absolute_uri
está documentado aquí .Rápido y simple, pero no es bueno para la producción:
(en una vista)
(en una plantilla)
Asegúrese de utilizar RequestContext , que es el caso si está utilizando render .
No confíes
request.META['HTTP_HOST']
en la producción: esa información proviene del navegador. En cambio, use la respuesta de @ CarlMeyerfuente
request.scheme
. Quizás solo esté disponible en versiones más recientes de django.request.scheme
se agregó en Django 1.7.{{ request.get_host }}
debería proteger contra ataques de encabezado de host HTTP cuando se usa junto con laALLOWED_HOSTS
configuración (agregado en Django 1.4.4).Tenga en cuenta que
{{ request.META.HTTP_HOST }}
no tiene la misma protección. Ver los documentos :En cuanto al uso de
request
en su plantilla, las llamadas a la función de representación de plantilla han cambiado en Django 1.8 , por lo que ya no tiene que manejarRequestContext
directamente.Aquí se explica cómo representar una plantilla para una vista, utilizando la función de acceso directo
render()
:A continuación, le mostramos cómo representar una plantilla para un correo electrónico, cuyo IMO es el caso más común en el que desea el valor de host:
Aquí hay un ejemplo de cómo agregar una URL completa en una plantilla de correo electrónico; request.scheme debería obtener
http
o,https
según lo que esté usando:fuente
Yo uso una etiqueta de plantilla personalizada. Agregar a, por ejemplo
<your_app>/templatetags/site.py
:Úselo en una plantilla como esta:
fuente
get_current
es un método documentado: docs.djangoproject.com/en/dev/ref/contrib/sites/…'http://%s'
podría ser un problema en caso dehttps
conexión; El esquema no es dinámico en este caso.Similar a la respuesta del usuario panchicore, esto es lo que hice en un sitio web muy simple. Proporciona algunas variables y las pone a disposición en la plantilla.
SITE_URL
mantendría un valor comoexample.com
SITE_PROTOCOL
mantendría un valor comohttp
ohttps
SITE_PROTOCOL_URL
mantendría un valor comohttp://example.com
ohttps://example.com
SITE_PROTOCOL_RELATIVE_URL
mantendría un valor como//example.com
.module / context_processors.py
settings.py
Luego, en sus plantillas, los utilizan como
{{ SITE_URL }}
,{{ SITE_PROTOCOL }}
,{{ SITE_PROTOCOL_URL }}
y{{ SITE_PROTOCOL_RELATIVE_URL }}
fuente
En una plantilla de Django puedes hacer:
fuente
django.template.context_processors.request
también [este tutorial ayudó] ( simpleisbetterthancomplex.com/tips/2016/07/20/… )Si utiliza el procesador de contexto de "solicitud" , y está utilizando el marco de sitios de Django , y tiene instalado el middleware del sitio (es decir, su configuración incluye estos):
... entonces tendrá el
request
objeto disponible en plantillas, y contendrá una referencia a la actualSite
para la solicitud comorequest.site
. Luego puede recuperar el dominio en una plantilla con:fuente
¿Qué hay de este enfoque? Funciona para mi. También se usa en el registro de django .
fuente
localhost
dará unhttps
esquema (se considera seguro) que no funcionará si tienes una URL estática (solohttp://127.0.0.1
es válida, nohttps://127.0.0.1
). Por lo tanto, no es ideal cuando todavía está en desarrollo.fuente
Puede usar
{{ protocol }}://{{ domain }}
en sus plantillas para obtener su nombre de dominio.fuente