Django visualizza l'URL dei file statici


133

Sto usando reportlab pdfgen per creare un PDF. Nel PDF c'è un'immagine creata da drawImage. Per questo ho bisogno dell'URL di un'immagine o del percorso di un'immagine nella vista. Sono riuscito a creare l'URL, ma come potrei ottenere il percorso locale per l'immagine?

Come ottengo l'URL:

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

Risposte:


287

Poiché questo è il miglior risultato su Google, ho pensato di aggiungere un altro modo per farlo. Personalmente preferisco questo, poiché lascia l'implementazione al framework 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
Sai se esiste un modo semplice per aggiungere il nome host all'URL statico (se non presente in STATIC_URL)? Devo aggiungere immagini o altre risorse nelle e-mail, in cui l'utente non sarà in grado di trovare le risorse con relativi URL.
Gepatino,

3
Questo non funziona per me durante l'esecuzione in Debug (non ho ancora provato con DEBUG = False). Ricevo semplicemente il percorso passato nel metodo statico restituito. Usare Django 1.6. qualche idea?
Shawn,

Penso che il codice che utilizza django.contrib.staticfiles.templatetags.staticfiles dovrebbe essere preferito tenendo conto della compatibilità con i magazzini django e simili.
jdcaballerov,

@gepatino È possibile indirizzare il risultato attraverso request.build_absolute_uricome descritto qui: stackoverflow.com/questions/2345708/...
dyve

17
In Django 2.0, questo mostrerà un avviso di deprecazione. Usa from django.templatetags.static import staticinvece.
Flimm,

86

La risposta di dyve è buona, tuttavia, se stai usando "memorizzazione nella cache" sul tuo progetto django e i percorsi URL finali dei file statici dovrebbero essere "cancellati" (come style.aaddd9d8d8d7.css da style.css ), allora non riesco a ottenere un URL preciso con django.templatetags.static.static(). Invece, è necessario utilizzare il tag modello da django.contrib.staticfilesper ottenere l'URL con hash.

Inoltre, nel caso in cui si utilizzi il server di sviluppo, questo metodo di tag modello restituisce un URL senza hash, quindi è possibile utilizzare questo codice indipendentemente dall'host che è sviluppo o produzione! :)

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
Grazie per questo ... mi ci è voluto un po 'per capire perché non stavo iniettando i miei hash md5
ilovett

4
Questa risposta sta ancora ottenendo successi e viene attivamente utilizzata, quindi ho migliorato la mia risposta accettata con crediti a @Kenial. Questa è ancora la soluzione preferita per questo problema.
tiva il

12

ecco un altro modo! (testato su Django 1.6)

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

Una buona soluzione in quanto restituirà l'URL con hash se DEBUG è impostato su False. Opzionalmente forzare l'URL con hash in questo modo: staticfiles_storage.url(path, force=True)
Marc Gibbons,

7

Usa il statictag predefinito :

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

C'è un altro tag in django.contrib.staticfiles.templatetags.staticfiles(come nella risposta accettata), ma è deprecato in Django 2.0+.


6

Da Django 3.0 dovresti usare from django.templatetags.static import static:

from django.templatetags.static import static

...

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

5

La risposta di @ dyve non ha funzionato per me nel server di sviluppo. Invece l'ho risolto con find. Ecco la funzione:

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

Se desideri ottenere l'URL assoluto (inclusi protocollo, host e porta), puoi utilizzare la request.build_absolute_urifunzione mostrata di seguito:

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'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.