Django statik dosyaların URL'sini görüntüler


133

PDF oluşturmak için reportlab pdfgen kullanıyorum. PDF'de tarafından oluşturulan bir görüntü var drawImage. Bunun için bir resmin URL'sine veya görünümdeki bir resmin yoluna ihtiyacım var. URL'yi oluşturmayı başardım, ancak resme giden yerel yolu nasıl alabilirim?

URL'yi nasıl alabilirim:

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

Yanıtlar:


287

Bu Google'daki en iyi sonuç olduğundan, bunu yapmanın başka bir yolunu ekleyeceğimi düşündüm. Şahsen ben bunu tercih ediyorum, çünkü uygulamayı Django çerçevesine bırakıyor.

# 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
Ana bilgisayar adını statik URL'ye eklemenin temiz bir yolu olup olmadığını biliyor musunuz (STATIC_URL içinde yoksa)? Kullanıcıların göreli URL'lerle kaynakları bulamayacağı postalarda resim veya başka kaynaklar eklemem gerekiyor.
gepatino

3
Debug'da çalışırken bu benim için çalışmaz (henüz DEBUG = False ile denemedim). Ben sadece döndürülen statik yöntemi geçen yolu olsun. Django Kullanımı 1.6. Düşüncesi olan var mı?
Shawn

Ben django.contrib.staticfiles.templatetags.staticfiles kullanarak kod django-depolar ve benzeri ile uyumlu dikkate alınarak tercih edilmelidir düşünüyorum.
jdcaballerov

@gepatino Sonucu request.build_absolute_uriburada açıklandığı gibi yönlendirebilirsiniz : stackoverflow.com/questions/2345708/…
dyve

17
Django 2.0'da, bu bir kullanımdan kaldırma bildirimi gösterecektir. from django.templatetags.static import staticBunun yerine kullanın .
Flimm

86

(gibi "karma" almalısınız "depolama önbelleğe alınmış" senin Django projesi ve statik dosyaların son url yollarında kullanıyorsanız dyve cevabı, ancak, iyi biridir style.aaddd9d8d8d7.css gelen style.css ), sonra ile kesin bir URL elde edemezsiniz django.templatetags.static.static(). Bunun yerine, django.contrib.staticfileskarma URL almak için şablon etiketini kullanmanız gerekir .

Ayrıca, geliştirme sunucusu kullanılması durumunda, bu şablon etiketi yöntemi karma olmayan url döndürür, böylece geliştirme veya üretim ana bilgisayarından bağımsız olarak bu kodu kullanabilirsiniz! :)

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
Bunun için teşekkürler ... neden md5 karmalarımı enjekte etmediğimi anlamak için biraz zaman
ayırdım

4
Bu cevap hala isabet alıyor ve aktif olarak kullanılıyor, bu yüzden kabul edilen cevabımı @Kenial'a geliştirdim. Bu hala bu sorun için tercih edilen çözümdür.
dyve

12

İşte başka bir yol! (Django 1.6 üzerinde test edilmiştir)

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

DEBUG False olarak ayarlanmışsa karma URL'yi döndürür. İsteğe bağlı olarak karma URL'yi şu şekilde zorlayın: staticfiles_storage.url(path, force=True)
Marc Gibbons

7

Varsayılan staticetiketi kullanın :

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

Başka bir etiket var django.contrib.staticfiles.templatetags.staticfiles(kabul edilen cevapta olduğu gibi), ancak Django 2.0+ sürümünde kullanımdan kaldırıldı.


6

Django 3.0'dan şunları kullanmalısınız from django.templatetags.static import static:

from django.templatetags.static import static

...

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

5

@ dyve'nin cevabı geliştirme sunucusunda benim için çalışmadı. Bunun yerine ile çözdüm find. İşte işlevi:

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

Mutlak URL almak istiyorsanız (protokol, ana bilgisayar ve bağlantı noktası dahil), request.build_absolute_uriaşağıdaki gibi gösterilen işlevi kullanabilirsiniz :

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'
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.