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"
olofom
fuente

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/'
dyve
fuente
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')
Kenial
fuente
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)
David Lam
fuente
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+.

Max Malysh
fuente
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')
devastador
fuente
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)
Jahongir Rahmonov
fuente
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'
Mesut Tasci
fuente