Джанго не удалось загрузить статическое изображение - PullRequest
0 голосов
/ 08 мая 2019

У меня есть приложение django, размещенное на pythonanywhere. Я использую weasyprint для создания PDF, и в моем PDF есть изображение, которое будет показано. Ошибка в журнале ошибок: «Не удалось загрузить изображение в /static/images/logo.png». Когда я пытаюсь открыть тот же путь, что и URL, он показывает мне изображение в браузере. Это означает, что он делает правильный путь, но что-то не так.

Мой статический каталог размещен вне приложения. И этот путь добавляется в файл настроек.

Структура моей папки:

     my_app
     static
        |__ css
        |__ images
              |__ logo.png
        |__ js
     templates
        |__ my_app
              |__ pdf.html

settings.py:

STATIC_DIR = os.path.join(BASE_DIR, 'static')
STATIC_URL = '/static/'
STATICFILES_DIRS =[
    STATIC_DIR,
]

pdf.html:

{% load static %}
<td><img class="my_logo" src="{% static 'images/logo.png' %}" alt="Temporarily Unavailable"></td>

Ответы [ 2 ]

3 голосов
/ 08 мая 2019

Предполагая, что структура папок, которую вы показываете, является той, которую вы используете на своей машине разработки, и отражает ваше реальное хранилище кода.

Ваши настройки верны:

  • STATICFILES_DIRS перечисляеткаталоги (вне приложений), куда вы помещаете ваши статические файлы
  • STATIC_URL - это URL-адрес, используемый для добавления префикса к статическому расположению, сообщая серверу «любой URL-адрес, начинающийся с этого, вам нужно выбрать статический».file ".

Чего не хватает:

  • STATIC_ROOT: куда collectstatic скопировать ваши статические файлы?Обычно это место за пределами вашего репозитория проекта, иногда даже на совершенно другой машине, откуда ваш веб-сервер будет обслуживать статические файлы.В простом развертывании это может быть каталог / static на том же уровне, что и ваш проект:
/home/myusername/my_project_www/
     |_ my_project/   <-- BASE_DIR (this is a git clone of your code)
          |_ my_project
                |_ settings.py
                |_ urls.py
          |_ app/
              |_ views.py
              |_ static/  <-- automatically used as source by Django
          |_ manage.py
          |_ static/  <-- added to STATICFILES_DIRS
          |_ ...
     |_ static/  <-- STATIC_ROOT all files will be copied and served from here
     |_ media/  <-- MEDIA_ROOT if users can upload files

В приведенном выше примере вы должны установить STATIC_ROOT = os.path.abspath(os.path.join(os.path.dirname(BASE_DIR), 'static')) (один каталог выше BASE_DIR).

  • Затем вам нужно запустить manage.py collectstatic, чтобы все статические файлы были скопированы в этот каталог.

  • И, наконец, в консоли pythonanywhere,в разделе Статические файлы необходимо сопоставить /static/ url с местоположением STATIC_ROOT, то есть /home/username/my_project_www/static/ для path .(Или, если вы используете свой собственный сервер, вам нужно настроить его в конфигурации nginx или apache).

Я написал сообщение в блоге оэто.

0 голосов
/ 11 мая 2019

Вы пытаетесь создать PDF для пользователя, чтобы загрузить, или вы пытаетесь отобразить HTML-файл?

Если вы используете weasyprint для создания PDF-файла, weasyprint не будет пытаться получить доступ к http://yourwebsite/static/images/logo.png, чтобы получить логотип для размещения в PDF-файле. Вместо этого он попытается получить доступ к файлу на вашем сервере в /static/images/logo.png.

Если все, что вы хотите сделать, это иметь логотип в своем PDF-файле, вы должны вместо этого получить weasyprint, чтобы сказать, что вместо этого введите логотип из /home/username/path/to/your/logo/file.png.

...