django无法加载静态图像

时间:2019-05-08 11:55:32

标签: html django django-staticfiles pythonanywhere

我的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 个答案:

答案 0 :(得分:3)

假设您显示的文件夹结构就是您在开发计算机上使用的文件夹结构,并且反映了您的实际代码存储库。

您的设置正确:

  • STATICFILES_DIRS列出了放置静态文件的目录(在应用程序外部)
  • STATIC_URL是用于为静态位置添加前缀的url,告诉服务器“以此开头的任何url,您都需要获取静态文件”。

缺少的是:

  • STATIC_ROOTcollectstatic应该将静态文件复制到哪里?通常这是项目存储库之外的位置,有时甚至是在完全不同的计算机上,Web服务器将在其中提供静态文件的位置。在简单的部署中,它可以是与您的项目相同级别的/ 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 Files 部分中,您必须将/static/ url 映射到{{ 1}},即STATIC_ROOT用于路径。 (或者,如果您正在运行自己的服务器,则需要在nginx或apache配置中对其进行配置。)

我为此写了blog post

答案 1 :(得分:0)

您是要制作供用户下载的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中。