¿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.
carl meyer
Si desea el encabezado del host HTTP real, consulte el comentario de Daniel Roseman sobre la respuesta de @Phsiao. La otra alternativa es 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 la configuración de su servidor web). En ese caso estás buscando:
from django.contrib.sites.models import Site
current_site = Site.objects.get_current()
current_site.domain
usted mismo tendría que colocar el objeto sitio_actual en un contexto de plantilla si desea usarlo. Si lo está usando en todas partes, puede empaquetarlo en un procesador de contexto de plantilla.
-
Para aclararle a alguien que tiene los mismos problemas que yo tuve: verifique que su
SITE_ID
ajuste es igual a laid
atributo del sitio actual en la aplicación Sitios (puede encontrar elid
en el panel de administración de Sitios). Cuando usted llamaget_current
Django toma tuSITE_ID
y devuelve elSite
objeto con esa identificación de la base de datos.– Dennis Golomázov
1 de julio de 2013 a las 9:12
-
Ninguno de estos funciona para mí.
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
– usuario10469346
11 de mayo de 2020 a las 13:43
danbrügge
he descubierto el {{ request.get_host }}
método.
-
Tenga en cuenta que esta respuesta tiene los mismos problemas del enfoque de Daniel Roseman (se puede falsificar), pero seguramente es más completa cuando se llega al host a través de un proxy HTTP o un equilibrador de carga, ya que tiene en cuenta
HTTP_X_FORWARDED_HOST
Encabezado HTTP.– furinas
08/01/2014 a las 19:02
-
Uso: “//{{ request.get_host }}/anything/else/you/want”… Asegúrese de completar su configuración ALLOWED_HOSTS (ver docs.djangoproject.com/en/1.5/ref/settings/#hosts-permitidos).
– set
19 de febrero de 2014 a las 12:59
-
@Seth mejor usar
request.build_absolute_uri
(docs.djangoproject.com/en/dev/ref/request-response/…)– Sr. Ksn
29 de noviembre de 2017 a las 12:29
-
necesito construir el nombre de host para mi aplicación dinámicamente para que no tenga que usar una declaración tenaria para cambiar entre cadenas para la versión de desarrollo local y la producción que necesitaban para probar un sistema de integración de pasarela de pago… usando request.get_host( ) en la vista y agregar agregar barra inclinada hacia adelante a la cadena devuelta hizo el trabajo
– Brian Obot
14 de junio a las 14:04
Creo que lo que quieres es tener acceso al contexto de la solicitud, consulta RequestContext.
-
request.META['HTTP_HOST']
te da el dominio. en una plantilla seria{{ request.META.HTTP_HOST }}
.– Daniel Rosemann
20 de septiembre de 2009 a las 14:42
-
Tenga cuidado con el uso de metadatos de solicitud. Viene de un navegador y puede ser falsificado. En general, probablemente querrá seguir lo que @CarlMeyer sugiere a continuación.
– José
3 de julio de 2012 a las 15:30
-
Para mis propósitos, esto no tiene ningún agujero de seguridad.
–Paul Draper
15 de marzo de 2013 a las 18:58
-
Supongo que, dado que Django 1.5 con la configuración de hosts permitidos, es seguro de usar. docs.djangoproject.com/en/1.5/ref/settings/#hosts-permitidos
–Daniel Backman
23 de septiembre de 2013 a las 15:13
-
¿Alguien puede explicar qué es el “agujero de seguridad”? Si el usuario falsifica la
Host:
encabezado y recibe 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 difiere eso de que un usuario tome el HTML generado y lo modifique antes de pasarlo a su propio navegador.– usuario193130
16 mayo 2016 a las 21:45
panchocore
Complementando a Carl Meyer, puedes hacer un procesador de contexto como este:
módulo.context_procesadores.py
from django.conf import settings
def site(request):
return {'SITE_URL': settings.SITE_URL}
configuración local.py
SITE_URL = 'http://google.com' # this will reduce the Sites framework db call.
configuración.py
TEMPLATE_CONTEXT_PROCESSORS = (
...
"module.context_processors.site",
....
)
plantillas que devuelven una instancia de contexto, la URL del sitio es {{ SITE_URL }}
puede escribir su propia rutina si desea manejar subdominios o SSL en el procesador de contexto.
Sé que esta pregunta es antigua, pero me topé con ella buscando una forma pitónica de obtener el dominio actual.
def myview(request):
domain = request.build_absolute_uri("https://stackoverflow.com/")[:-1]
# that will build the complete domain: http://foobar.com
eduardo newell
Rápido y simple, pero no bueno para la producción:
(en una vista)
request.scheme # http or https
request.META['HTTP_HOST'] # example.com
request.path # /some/content/1/
(en una plantilla)
{{ request.scheme }} :// {{ request.META.HTTP_HOST }} {{ request.path }}
Asegúrese de usar un Contexto de solicitudque es el caso si está utilizando prestar.
no confíes request.META['HTTP_HOST']
en producción: esa información proviene del navegador. En su lugar, use la respuesta de @CarlMeyer
La variación del procesador de contexto que uso es:
from django.contrib.sites.shortcuts import get_current_site
from django.utils.functional import SimpleLazyObject
def site(request):
return {
'site': SimpleLazyObject(lambda: get_current_site(request)),
}
los SimpleLazyObject
wrapper se asegura de que la llamada DB solo ocurra cuando la plantilla realmente usa el site
objeto. Esto elimina la consulta de las páginas de administración. También almacena en caché el resultado.
e incluirlo en la configuración:
TEMPLATE_CONTEXT_PROCESSORS = (
...
"module.context_processors.site",
....
)
En la plantilla, puede utilizar {{ site.domain }}
para obtener el nombre de dominio actual.
editar: para admitir también el cambio de protocolo, use:
def site(request):
site = SimpleLazyObject(lambda: get_current_site(request))
protocol="https" if request.is_secure() else 'http'
return {
'site': site,
'site_root': SimpleLazyObject(lambda: "{0}://{1}".format(protocol, site.domain)),
}
-
No necesitas usar
SimpleLazyObject
aquí, porque la lambda no se llamará si nada accede al ‘sitio’ de todos modos.– monocromo
07/08/2014 a las 22:26
-
Si quitas el
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 use en la plantilla.– vdboor
14 de agosto de 2014 a las 9:51
-
Dado que es una función, la cadena de host no se procesará a menos que se use de todos modos. Entonces, puede simplemente asignar una función a ‘site_root’ y no necesita SimpleLazyObject. Django llamará a la función cuando se use. Ya ha creado la función necesaria con una lambda aquí de todos modos.
– monocromo
20 de agosto de 2014 a las 17:42
-
Ah, sí, solo funcionaría una lambda. los
SimpleLazyObject
está ahí para evitar la reevaluación de la función, que en realidad no es necesaria ya que elSite
el objeto se almacena en caché.– vdboor
27 de agosto de 2014 a las 9:25
-
La importación es ahora
from django.contrib.sites.shortcuts import get_current_site
– Hraban
14 de junio de 2016 a las 5:15