¿Cómo obtener el nombre de dominio de mi sitio dentro de una plantilla de Django?

6 minutos de lectura

¿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.

Avatar de usuario de Carl Meyer
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 la id atributo del sitio actual en la aplicación Sitios (puede encontrar el id en el panel de administración de Sitios). Cuando usted llama get_currentDjango toma tu SITE_ID y devuelve el Site 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


avatar de usuario de danbruegge
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

avatar de usuario de panchicore
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

  • build_absolute_uri está documentado aquí.

    – Philipp Zedler

    10/09/2015 a las 19:46

Avatar de usuario de Edward Newell
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

  • build_absolute_uri está documentado aquí.

    – Philipp Zedler

    10/09/2015 a las 19:46

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 SimpleLazyObjectcada RequestContext 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 el Site 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

¿Ha sido útil esta solución?