template - django views
¿Cómo puedo obtener la URL completa/absoluta(con dominio) en Django? (17)
¿Cómo puedo obtener la URL completa / absoluta (por ejemplo, https://example.com/some/path
) en Django sin el módulo de Sitios ? Eso es una tontería ... ¡No debería necesitar consultar mi base de datos para enganchar la URL!
Quiero usarlo con reverse()
.
django-fullurl
Si intentas hacer esto en una plantilla de Django, he lanzado un pequeño paquete de PyPI django-fullurl
para permitirte reemplazar las etiquetas de url
y plantillas static
con fullurl
y fullstatic
, como esto:
{% load fullurl %}
Absolute URL is: {% fullurl "foo:bar" %}
Another absolute URL is: {% fullstatic "kitten.jpg" %}
Esperamos que estas insignias se mantengan actualizadas automáticamente:
En una vista, por supuesto, puede usar request.build_absolute_uri
lugar.
En su opinión, simplemente haga esto:
base_url = "{0}://{1}{2}".format(request.scheme, request.get_host(), request.path)
Entiendo:
wsgiref.util.request_uri(request.META)
Obtenga el uri completo con el esquema, el host, la ruta del puerto y la consulta.
Examine el diccionario Request.META
que aparece. Creo que tiene el nombre del servidor y el puerto del servidor.
Otra forma más. Podría usar build_absolute_uri()
en su view.py
y pasarlo a la plantilla.
ver.py
def index(request):
baseurl = request.build_absolute_uri()
return render_to_response(''your-template.html'', { ''baseurl'': baseurl })
tu-plantilla.html
{{ baseurl }}
Para crear un enlace completo a otra página desde una plantilla, puede usar esto:
{{ request.META.HTTP_HOST }}{% url ''views.my_view'' my_arg %}
request.META.HTTP_HOST proporciona el nombre de host y url proporciona el nombre relativo. El motor de plantillas luego los concatena en una url completa.
Prueba el siguiente código:
{{ request.scheme }}://{{ request.META.HTTP_HOST }}
Puedes probar "request.get_full_path ()"
Sé que esta es una vieja pregunta. Pero creo que la gente todavía se topa 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 quiere en su plantilla, por ejemplo:
{{url_parts.domain}}
Si está usando el framework REST de django, puede usar la función de reversa de rest_framework.reverse
. Esto tiene el mismo comportamiento que django.core.urlresolvers.reverse
, excepto que usa un parámetro de solicitud para construir una URL completa.
from rest_framework.reverse import reverse
# returns the full url
url = reverse(''view_name'', args=(obj.pk,), request=request)
# returns only the relative url
url = reverse(''view_name'', args=(obj.pk,))
Editado para mencionar la disponibilidad solo en el marco REST
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:
# settings.py (Django < 1.9)
...
BASE_URL = ''http://example.com''
TEMPLATE_CONTEXT_PROCESSORS = (
...
''myapp.context_processors.extra_context'',
)
# settings.py (Django >= 1.9)
TEMPLATES = [
{
''BACKEND'': ''django.template.backends.django.DjangoTemplates'',
''DIRS'': [],
''APP_DIRS'': True,
''OPTIONS'': {
''context_processors'': [
''django.template.context_processors.debug'',
''django.template.context_processors.request'',
''django.contrib.auth.context_processors.auth'',
''django.contrib.messages.context_processors.messages'',
# Additional
''myapp.context_processors.extra_context'',
],
},
},
]
# myapp/context_processors.py
from django.conf import settings
def extra_context(request):
return {''base_url'': settings.BASE_URL}
# my_template.html
<p>Base url is {{ base_url }}.</p>
Si no puede obtener acceso a la request
, no puede usar get_current_site(request)
como se recomienda en algunas soluciones aquí. Puede usar una combinación del marco de Sitios nativos y get_absolute_url
en get_absolute_url
lugar. Configure al menos un Site en el administrador, asegúrese de que su modelo tenga un método get_absolute_url() , 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 = ''http://{domain}{path}''.format(domain=domain, path=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
Si quieres usarlo con reverse()
puedes hacer esto: request.build_absolute_uri(reverse(''view_name'', args=(obj.pk, )))
También puede usar get_current_site
como parte de la aplicación del sitio ( from django.contrib.sites.models import get_current_site
). Toma un objeto de solicitud y toma como valor predeterminado el objeto de sitio que ha configurado con SITE_ID
en settings.py si la solicitud es None
. Lea más en la documentación para usar el framework 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 / 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.
También puedes usar:
import socket
socket.gethostname()
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 acceder a su página.
Utilice el método práctico request.build_absolute_uri() a petición, pásele la URL relativa y le dará una completa.
De forma predeterminada, se devuelve la URL absoluta para request.get_full_path()
, pero puede pasar una URL relativa como el primer argumento para convertirla en una URL absoluta.
request.get_host()
te dará el dominio.