Django obtiene la URL de los archivos estáticos a la vista


133

Estoy usando reportlab pdfgen para crear un PDF. En el PDF hay una imagen creada por drawImage. Para esto, necesito la URL de una imagen o la ruta a una imagen en la vista. Logré construir la URL, pero ¿cómo obtendría la ruta local a la imagen?

Cómo obtengo la URL:

prefix = 'https://' if request.is_secure() else 'http://'
image_url = prefix + request.get_host() + STATIC_URL + "images/logo_80.png"

Respuestas:


287

Dado que este es el mejor resultado en Google, pensé que agregaría otra forma de hacerlo. Personalmente, prefiero este, ya que deja la implementación al marco de Django.

# Original answer said:
# from django.templatetags.static import static
# Improved answer (thanks @Kenial, see below)
from django.contrib.staticfiles.templatetags.staticfiles import static

url = static('x.jpg')
# url now contains '/static/x.jpg', assuming a static path of '/static/'

2
¿Sabes si hay una manera limpia de agregar el nombre de host a la URL estática (si no está presente en STATIC_URL)? Necesito agregar imágenes u otros recursos en los correos, donde el usuario no podrá encontrar los recursos con direcciones URL relativas.
gepatino

3
Esto no funciona para mí mientras se ejecuta en Debug (aún no lo he intentado con DEBUG = False). Simplemente obtengo el camino pasado al método estático devuelto. Usando Django 1.6. ¿Alguna idea?
Shawn

Creo que el código que usa django.contrib.staticfiles.templatetags.staticfiles debe preferirse teniendo en cuenta que es compatible con django-storages y similares.
jdcaballerov

@gepatino Puede enrutar el resultado request.build_absolute_uricomo se describe aquí: stackoverflow.com/questions/2345708/…
dyve

17
En Django 2.0, esto mostrará un aviso de desaprobación. Usar en su from django.templatetags.static import staticlugar.
Flimm

86

la respuesta de dyve es buena, sin embargo, si está utilizando "almacenamiento en caché" en su proyecto django y las rutas de URL finales de los archivos estáticos deberían ser "hash" (como style.aaddd9d8d8d7.css de style.css ), entonces usted no se puede obtener una url precisa con django.templatetags.static.static(). En su lugar, debe usar la etiqueta de plantilla de django.contrib.staticfilespara obtener la URL hash.

Además, en el caso de usar un servidor de desarrollo, este método de etiqueta de plantilla devuelve una URL sin hash, por lo que puede usar este código independientemente de que el host sea de desarrollo o producción. :)

from django.contrib.staticfiles.templatetags.staticfiles import static

# 'css/style.css' file should exist in static path. otherwise, error will occur 
url = static('css/style.css')

1
Gracias por esto ... me tomó un tiempo descubrir por qué no me inyectaban los hash md5
ilovett

44
Esta respuesta todavía está recibiendo visitas y se usa activamente, por lo que mejoré mi respuesta aceptada con créditos a @Kenial. Esta sigue siendo la solución preferida para este problema.
dyve

12

¡Aquí hay otra manera! (probado en Django 1.6)

from django.contrib.staticfiles.storage import staticfiles_storage
staticfiles_storage.url(path)

Buena solución ya que esto devolverá la URL hash si DEBUG está configurado en False. Opcionalmente, fuerce la URL hash de la siguiente manera: staticfiles_storage.url(path, force=True)
Marc Gibbons,

7

Use la staticetiqueta predeterminada :

from django.templatetags.static import static
static('favicon.ico')

Hay otra etiqueta en django.contrib.staticfiles.templatetags.staticfiles(como en la respuesta aceptada), pero está en desuso en Django 2.0+.


6

Desde Django 3.0 deberías usar from django.templatetags.static import static:

from django.templatetags.static import static

...

img_url = static('images/logo_80.png')

5

La respuesta de @ dyve no me funcionó en el servidor de desarrollo. En cambio lo resolví con find. Aquí está la función:

from django.conf import settings
from django.contrib.staticfiles.finders import find
from django.templatetags.static import static

def get_static(path):
    if settings.DEBUG:
        return find(path)
    else:
        return static(path)

1

Si desea obtener la URL absoluta (incluido el protocolo, el host y el puerto), puede usar la request.build_absolute_urifunción que se muestra a continuación:

from django.contrib.staticfiles.storage import staticfiles_storage
self.request.build_absolute_uri(staticfiles_storage.url('my-static-image.png'))
# 'http://localhost:8000/static/my-static-image.png'
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.