¿Cómo puedo obtener la URL completa / absoluta (por ejemplo https://example.com/some/path
) en Django sin el módulo Sitios ? Eso es una tontería ... ¡No debería necesitar consultar mi base de datos para enganchar la URL!
Quiero usarlo con reverse()
.
Respuestas:
Utilice el práctico método request.build_absolute_uri () a pedido, páselo por la URL relativa y le dará una completa.
De forma predeterminada,
request.get_full_path()
se devuelve la URL absoluta para , pero puede pasarle una URL relativa como primer argumento para convertirla en una URL absoluta.fuente
{{ request.build_absolute_uri }}{{ object.get_absolute_url }}
- y heyho, url completa.{% if request.is_secure %}https://{% else %}http://{% endif %}{{ request.get_host }}{{ object.get_absolute_url }}
porque{{ request.build_absolute_uri }}
tenía una barra inclinada final y{{ object.get_absolute_url }}
comencé con una barra diagonal que resultó en barras diagonales dobles en la URL.Si quieres usarlo
reverse()
puedes hacerlo:request.build_absolute_uri(reverse('view_name', args=(obj.pk, )))
fuente
url_name
lugar deview_name
)def reverse(viewname, urlconf=None, args=None, kwargs=None, current_app=None)
También puede usarlo
get_current_site
como parte de la aplicación de sitios (from django.contrib.sites.models import get_current_site
). Toma un objeto de solicitud, y por defecto es el objeto de sitio que ha configuradoSITE_ID
en settings.py si la solicitud esNone
. Lea más en la documentación para usar el framework de sitiosp.ej
No es tan compacto / ordenado como
request.build_absolute_url()
, pero se puede usar cuando los objetos de solicitud no están disponibles y tiene una URL de sitio predeterminada.fuente
django.contrib.sites
en suINSTALLED_APPS
, no llegará a la base de datos en absoluto, y proporcionará información basada en el objeto Solicitud (consulte get_current_site )build_absolute_uri
aún parece la solución más fácil y limpia.Si no puede acceder,
request
entonces no puede usarget_current_site(request)
como se recomienda en algunas soluciones aquí. Puede utilizar una combinación del marco de Sitios nativo y en suget_absolute_url
lugar. Configure al menos un sitio en el administrador, asegúrese de que su modelo tenga un método get_absolute_url () , luego:https://docs.djangoproject.com/en/dev/ref/contrib/sites/#getting-the-current-domain-for-full-urls
fuente
request
queNone
o llameget_current_site(None)
.Si no desea acceder a la base de datos, puede hacerlo con una configuración. Luego, use un procesador de contexto para agregarlo a cada plantilla:
fuente
En su opinión, solo haga esto:
fuente
django-fullurl
Si está tratando de hacer esto en una plantilla de Django, he lanzado un pequeño paquete PyPI
django-fullurl
para permitirle reemplazarurl
ystatic
etiquetas de plantilla confullurl
yfullstatic
, de esta manera:Es de esperar que estas insignias se mantengan actualizadas automáticamente:
En una vista, por supuesto, puede usar
request.build_absolute_uri
en su lugar.fuente
request
objeto para obtener el nombre de dominio. En ese caso, debe usar elsites
marco en su lugar, que obtiene el nombre de dominio de la base de datos. Verdjango-absoluteuri
, mencionado en la sección "ver también" del archivo README de este paquete PyPI.Para crear un enlace completo a otra página desde una plantilla, puede usar esto:
request.META.HTTP_HOST proporciona el nombre del host y url proporciona el nombre relativo. El motor de plantillas los concatena en una url completa.
fuente
http
en este contexto) y://
parte de la URL, por lo que no proporcionará una URL completa .Otra forma más. Puede usar
build_absolute_uri()
en suview.py
y pasarlo a la plantilla.view.py
your-template.html
fuente
HttpRequest.build_absolute_uri(request)
es equivalente arequest.build_absolute_uri()
no es así?Examine el
Request.META
diccionario que viene. Creo que tiene el nombre del servidor y el puerto del servidor.fuente
Prueba el siguiente código:
fuente
Esto funcionó para mí en mi plantilla:
Necesitaba la url completa para pasarla a una función js fetch. Espero que esto te ayude.
fuente
Sé que esta es una vieja pregunta. Pero creo que la gente todavía se encuentra con esto mucho.
Hay un par de bibliotecas que complementan la funcionalidad predeterminada de Django. He intentado algunos. Me gusta la siguiente biblioteca cuando se hace referencia inversa a las URL absolutas:
https://github.com/fusionbox/django-absoluteuri
Otro que me gusta porque puedes armar fácilmente un dominio, protocolo y ruta es:
https://github.com/RRMoelker/django-full-url
Esta biblioteca le permite simplemente escribir lo que quiera en su plantilla, por ejemplo:
fuente
Si está utilizando django REST framework, puede utilizar la función inversa de
rest_framework.reverse
. Tiene el mismo comportamiento quedjango.core.urlresolvers.reverse
, excepto que utiliza un parámetro de solicitud para crear una URL completa.Editado para mencionar la disponibilidad solo en el marco REST
fuente
request=request
. Tampoco parece que la solicitud esté documentada aquí docs.djangoproject.com/en/1.9/ref/urlresolvers/#reverseLo tengo:
Obtenga la uri completa con esquema, host, ruta de puerto y consulta.
fuente
También hay ABSOLUTE_URL_OVERRIDES disponibles como configuración
https://docs.djangoproject.com/en/2.1/ref/settings/#absolute-url-overrides
Pero eso anula get_absolute_url (), lo que puede no ser deseable.
En lugar de instalar el framework de sitios solo para esto o hacer algunas de las otras cosas mencionadas aquí que se basan en el objeto de solicitud, creo que la mejor solución es colocar esto en models.py
Defina BASE_URL en settings.py, luego impórtelo en models.py y cree una clase abstracta (o agréguela a una que ya esté usando) que defina get_truly_absolute_url (). Podría ser tan simple como:
Subclasifícalo y ahora puedes usarlo en todas partes.
fuente
Como se menciona en otras respuestas,
request.build_absolute_uri()
es perfecto si tiene acceso a élrequest
, y elsites
marco es excelente siempre que diferentes URL apunten a diferentes bases de datos.Sin embargo, mi caso de uso fue ligeramente diferente. Mi servidor provisional y el servidor de producción acceden a la misma base de datos, pero
get_current_site
ambos devolvieron el primerosite
en la base de datos. Para resolver esto, debe usar algún tipo de variable de entorno. Puede usar 1) una variable de entorno (algo así comoos.environ.get('SITE_URL', 'localhost:8000')
) o 2) diferentesSITE_ID
s para diferentes servidores Y diferentes configuraciones.py .¡Espero que alguien encuentre esto útil!
fuente
Encontré este hilo porque estaba buscando construir un URI absoluto para una página de éxito.
request.build_absolute_uri()
me dio un URI para mi vista actual pero para obtener el URI para mi vista de éxito usé lo siguiente ...request.build_absolute_uri (reverse ('success_view_name'))
fuente
request.get_host()
te dará el dominio.fuente
También puedes usar:
Esto está funcionando bien para mí
No estoy completamente seguro de cómo funciona. Creo que este es un nivel un poco más bajo y devolverá el nombre de host de su servidor, que podría ser diferente al nombre de host utilizado por su usuario para llegar a su página.
fuente
Puedes probar "request.get_full_path ()"
fuente