¿Cómo puedo obtener la URL completa/absoluta (con dominio) en Django?

Resuelto mpen asked hace 14 años • 30 respuestas

¿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 obtener la URL!

Quiero usarlo con reverse().

mpen avatar Feb 27 '10 07:02 mpen
Aceptado

Utilice el práctico método request.build_absolute_uri() cuando lo solicite, pásele la URL relativa y le dará una completa.

De forma predeterminada, se devuelve la URL absoluta request.get_full_path(), pero puede pasarle una URL relativa como primer argumento para convertirla en una URL absoluta.

>>> request.build_absolute_uri()
'https://example.com/music/bands/the_beatles/?print=true'
>>> request.build_absolute_uri('/bands/?print=true')
'https://example.com/bands/?print=true'
Dmitry Shevchenko avatar Feb 27 '2010 02:02 Dmitry Shevchenko

Si quieres usarlo reverse()puedes hacer esto:request.build_absolute_uri(reverse('view_name', args=(obj.pk, )))

ébewè avatar Aug 23 '2013 07:08 ébewè

Si no puede acceder, requestno podrá utilizarlo get_current_site(request)como se recomienda en algunas soluciones aquí. Puede utilizar una combinación del marco nativo de Sites y get_absolute_urlen su lugar. Configure al menos un sitio en el administrador, asegúrese de que su modelo tenga un método get_absolute_url() y luego:

>>> from django.contrib.sites.models import Site
>>> domain = Site.objects.get_current().domain
>>> obj = MyModel.objects.get(id=3)
>>> path = obj.get_absolute_url()

>>> url = f'https://{domain}{path}'
>>> print(url)
'http://example.com/mymodel/objects/3/'

https://docs.djangoproject.com/en/dev/ref/contrib/sites/#getting-the-current-domain-for-full-urls

shacker avatar Jul 25 '2014 19:07 shacker

También puede utilizarlo get_current_sitecomo parte de la aplicación de sitios ( from django.contrib.sites.models import get_current_site). Toma un objeto de solicitud y, de forma predeterminada, es el objeto de sitio que ha configurado SITE_IDen settings.py si la solicitud es None. Lea más en la documentación para usar el marco de sitios.

p.ej

from django.contrib.sites.shortcuts import get_current_site
request = None
full_url = ''.join(['http://', get_current_site(request).domain, obj.get_absolute_url()])

No es tan compacto ni tan ordenado como request.build_absolute_url(), pero se puede utilizar cuando los objetos de solicitud no están disponibles y tiene una URL de sitio predeterminada.

Darb avatar Jan 11 '2012 10:01 Darb