O Django exibe a URL dos arquivos estáticos

133

Estou usando o reportlab pdfgen para criar um PDF. No PDF, há uma imagem criada por drawImage. Para isso, eu preciso do URL de uma imagem ou do caminho para uma imagem na exibição. Consegui criar o URL, mas como obteria o caminho local da imagem?

Como obtenho o URL:

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

Respostas:

287

Como esse é o melhor resultado no Google, pensei em adicionar outra maneira de fazer isso. Pessoalmente, eu prefiro este, pois deixa a implementação no 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/'
dyve
fonte
2
Você sabe se existe uma maneira limpa de adicionar o nome do host ao URL estático (se não estiver presente em STATIC_URL)? Preciso adicionar imagens ou outros recursos nos emails, onde o usuário não poderá encontrar os recursos com URLs relativos.
gepatino 12/09
3
Isso não funciona para mim durante a execução no Debug (ainda não tentei com DEBUG = False). Simplesmente recebo o caminho passado para o método estático retornado. Usando o Django 1.6. Alguma ideia?
Shawn
Eu acho que o código usando django.contrib.staticfiles.templatetags.staticfiles deve ser preferido, levando em consideração que é compatível com django-storages e similares.
Jdcaballerov
@gepatino Você pode rotear o resultado request.build_absolute_uriconforme descrito aqui: stackoverflow.com/questions/2345708/…
dyve
17
No Django 2.0, isso mostrará um aviso de reprovação. Use em from django.templatetags.static import staticvez disso.
Flimm
86

A resposta do dyve é boa, no entanto, se você estiver usando "armazenamento em cache" em seu projeto django e os caminhos de URL finais dos arquivos estáticos devem receber "hash" (como style.aaddd9d8d8d7.css de style.css ), então você Não é possível obter um URL preciso django.templatetags.static.static(). Em vez disso, você deve usar a tag template de django.contrib.staticfilespara obter um URL com hash.

Além disso, no caso de usar o servidor de desenvolvimento, esse método de tag de modelo retorna um URL sem hash, para que você possa usar esse código, independentemente do host que estiver em desenvolvimento ou produção! :)

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
fonte
1
Obrigado por isso ... me levou um tempo para descobrir por que eu não estava recebendo meus hashes MD5 injetado
ilovett
4
Essa resposta ainda está sendo acessada e é usada ativamente, por isso melhorei minha resposta aceita com créditos para o @Kenial. Essa ainda é a solução preferida para esse problema.
Dyve # 7/15
12

aqui está outra maneira! (testado no Django 1.6)

from django.contrib.staticfiles.storage import staticfiles_storage
staticfiles_storage.url(path)
David Lam
fonte
Boa solução, pois isso retornará o URL com hash se DEBUG estiver definido como False. Opcionalmente, force o URL com hash da seguinte maneira: staticfiles_storage.url(path, force=True)
Marc Gibbons
7

Use a statictag padrão :

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

Há outra tag django.contrib.staticfiles.templatetags.staticfiles(como na resposta aceita), mas foi descontinuada no Django 2.0+.

Max Malysh
fonte
6

No Django 3.0, você deve usar from django.templatetags.static import static:

from django.templatetags.static import static

...

img_url = static('images/logo_80.png')
devaerial
fonte
5

A resposta do @ dyve não funcionou para mim no servidor de desenvolvimento. Em vez disso, eu resolvi isso find. Aqui está a função:

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
fonte
1

Se você deseja obter uma URL absoluta (incluindo protocolo, host e porta), pode usar a request.build_absolute_urifunção mostrada abaixo:

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
fonte