我的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>
答案 0 :(得分:3)
假设您显示的文件夹结构就是您在开发计算机上使用的文件夹结构,并且反映了您的实际代码存储库。
您的设置正确:
STATICFILES_DIRS
列出了放置静态文件的目录(在应用程序外部)STATIC_URL
是用于为静态位置添加前缀的url,告诉服务器“以此开头的任何url,您都需要获取静态文件”。缺少的是:
STATIC_ROOT
:collectstatic
应该将静态文件复制到哪里?通常这是项目存储库之外的位置,有时甚至是在完全不同的计算机上,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
中。