¿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_IDconfiguración sea igual alidatributo del sitio actual en la aplicación Sitios (puede encontrarloiden el panel de administración de Sitios). Cuando llamasget_current, Django toma tuSITE_IDy devuelve elSiteobjeto 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:8001He descubierto el
{{ request.get_host }}método.fuente
HTTP_X_FORWARDED_HOSTencabezado 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
SimpleLazyObjectcontenedor se asegura de que la llamada a la base de datos solo ocurra cuando la plantilla realmente use elsiteobjeto. 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
SimpleLazyObjectaquí, porque de todos modos no se llamará a lambda si nada accede al "sitio".SimpleLazyObject, cadaRequestContextllamará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.SimpleLazyObjectestá ahí para evitar la re-evaluación de la función, que no es realmente necesario ya que elSitese almacena en caché de objetos.from django.contrib.sites.shortcuts import get_current_siteSé que esta pregunta es antigua, pero me topé con ella buscando una forma pitónica para obtener el dominio actual.
fuente
build_absolute_uriestá 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.schemese agregó en Django 1.7.{{ request.get_host }}debería proteger contra ataques de encabezado de host HTTP cuando se usa junto con laALLOWED_HOSTSconfiguració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
requesten 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 manejarRequestContextdirectamente.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
httpo,httpssegú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_currentes un método documentado: docs.djangoproject.com/en/dev/ref/contrib/sites/…'http://%s'podría ser un problema en caso dehttpsconexió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_URLmantendría un valor comoexample.comSITE_PROTOCOLmantendría un valor comohttpohttpsSITE_PROTOCOL_URLmantendría un valor comohttp://example.comohttps://example.comSITE_PROTOCOL_RELATIVE_URLmantendrí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.requesttambié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
requestobjeto disponible en plantillas, y contendrá una referencia a la actualSitepara 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
localhostdará unhttpsesquema (se considera seguro) que no funcionará si tienes una URL estática (solohttp://127.0.0.1es 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