Django получает URL-адрес статических файлов в поле зрения

Я использую reportlab pdfgen для создания PDF. В PDF-файле есть изображение, созданное drawImage. Для этого мне нужен либо URL-адрес изображения, либо путь к изображению в представлении. Мне удалось создать URL-адрес, но как мне получить локальный путь к изображению?

Как я получаю URL:

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

person olofom    schedule 30.07.2012    source источник


Ответы (7)


Поскольку это лучший результат в Google, я подумал, что добавлю еще один способ сделать это. Лично я предпочитаю этот вариант, поскольку он оставляет реализацию в рамках 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/'
person dyve    schedule 19.07.2013
comment
Знаете ли вы, есть ли чистый способ добавления имени хоста к статическому URL-адресу (если его нет в STATIC_URL)? Мне нужно добавить изображения или другие ресурсы в сообщения электронной почты, где пользователь не сможет найти ресурсы с относительными URL-адресами. - person gepatino; 13.09.2013
comment
У меня это не работает при работе в Debug (еще не пробовал с DEBUG = False). Я просто получаю путь, переданный в возвращаемый статический метод. Использование Django 1.6. Есть предположения? - person Shawn; 12.12.2013
comment
Я думаю, что код, использующий django.contrib.staticfiles.templatetags.staticfiles, следует предпочесть, учитывая, что он совместим с django-хранилищами и т.п. - person jdcaballerov; 10.07.2014
comment
@gepatino Вы можете направить результат через request.build_absolute_uri, как описано здесь: stackoverflow.com/questions/2345708/ - person dyve; 11.11.2014
comment
Для тех, у кого такая же проблема, как у @Shawn (или у меня), это может быть потому, что вы указываете путь, который начинается с косой черты. Не делайте static('/style.css'), делайте вместо этого static('style.css'). - person Djizeus; 06.10.2015
comment
В Django 2.0 это покажет уведомление об устаревании. Вместо этого используйте from django.templatetags.static import static. - person Flimm; 11.05.2017
comment
В журналах сервера Django 2.0.1 я получаю No such file or directory: '/static/my_file_name.xlsx', тогда как я могу видеть файл, если обращаюсь к URL-адресу непосредственно из браузера localhost:8080/static/my_file_name.xlsx - person Anupam; 25.01.2018
comment
@Anupam, вы, вероятно, добавили '/static' в свой аргумент функции static, что неверно. Попробуйте static('my_file_name.xlsx'). - person shad0w_wa1k3r; 20.03.2018

Ответ dyve хорош, однако, если вы используете «кешированное хранилище» в своем проекте django, а конечные URL-адреса статических файлов должны быть «хешированы» (например, style.aaddd9d8d8d7.css из style.css), то вы не сможете получить точный URL с помощью django.templatetags.static.static(). Вместо этого вы должны использовать тег шаблона из django.contrib.staticfiles, чтобы получить хешированный URL.

Кроме того, в случае использования сервера разработки этот метод тега шаблона возвращает нехешированный URL-адрес, поэтому вы можете использовать этот код независимо от того, на каком хосте он разрабатывается или производится! :)

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')
person Kenial    schedule 14.10.2013
comment
Спасибо за это ... мне потребовалось время, чтобы понять, почему мне не вводили хеши md5 - person ilovett; 25.05.2014
comment
Этот ответ все еще набирает популярность и активно используется, поэтому я улучшил свой принятый ответ, добавив благодарностей @Kenial. Это по-прежнему предпочтительное решение этой проблемы. - person dyve; 07.10.2015

Начиная с Django 3.0 вы должны использовать from django.templatetags.static import static:

from django.templatetags.static import static

...

img_url = static('images/logo_80.png')
person devaerial    schedule 16.12.2019

вот еще способ! (проверено на Django 1.6)

from django.contrib.staticfiles.storage import staticfiles_storage
staticfiles_storage.url(path)
person David Lam    schedule 21.06.2016
comment
Хорошее решение, так как это вернет хешированный URL-адрес, если для DEBUG установлено значение False. При желании принудительно использовать хешированный URL-адрес следующим образом: staticfiles_storage.url(path, force=True) - person Marc Gibbons; 30.05.2019

Используйте тег static по умолчанию:

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

В django.contrib.staticfiles.templatetags.staticfiles есть еще один тег (как в принятом ответе), но он устарел в Django 2.0+.

person Max Malysh    schedule 22.07.2019

Ответ @dyve не работал у меня на сервере разработки. Вместо этого я решил это с помощью find. Вот функция:

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)
person Jahongir Rahmonov    schedule 26.07.2018

Если вы хотите получить абсолютный URL-адрес (включая протокол, хост и порт), вы можете использовать функцию request.build_absolute_uri, как показано ниже:

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'
person Mesut Tasci    schedule 06.05.2019