¿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_namelugar deview_name)def reverse(viewname, urlconf=None, args=None, kwargs=None, current_app=None)También puede usarlo
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 por defecto es el objeto de sitio que ha configuradoSITE_IDen 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.sitesen 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_uriaún parece la solución más fácil y limpia.Si no puede acceder,
requestentonces 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_urllugar. 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
requestqueNoneo 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-fullurlSi está tratando de hacer esto en una plantilla de Django, he lanzado un pequeño paquete PyPI
django-fullurlpara permitirle reemplazarurlystaticetiquetas de plantilla confullurlyfullstatic, de esta manera:Es de esperar que estas insignias se mantengan actualizadas automáticamente:
En una vista, por supuesto, puede usar
request.build_absolute_urien su lugar.fuente
requestobjeto para obtener el nombre de dominio. En ese caso, debe usar elsitesmarco 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
httpen 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.pyy 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.METAdiccionario 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 elsitesmarco 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_siteambos devolvieron el primerositeen 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_IDs 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