Whitenoise和Django压缩器导致404压缩文件
试图部署Django应用程序到Heroku使用whitenoise和django压缩机。Whitenoise和Django压缩器导致404压缩文件
通过DEBUG = False
和COMPRESS_ENABLED = True
将其部署到生产环境中,可以毫无问题地访问我的所有静态资产。然而,所有的压缩文件返回404,如:
HTTP://*.herokuapp.com/static/CACHE/css/fbfaa35dc638.css未能 加载资源:服务器的状态为回应404(未找到)
要么使DEBUG
或禁用COMPRESS_ENABLED
解决问题,当然不是我想要的。
我也在设置STATICFILES_STORAGE = 'whitenoise.django.GzipManifestStaticFilesStorage'
,但改变这并没有帮助。
某些设置(注意我有例如base.py
,local.py
,等等。这就是为什么我需要的路径额外../
一个设置目录):
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, '../staticfiles')
STATICFILES_DIRS = (
os.path.join(BASE_DIR, '../static'),
)
STATICFILES_FINDERS = (
'django.contrib.staticfiles.finders.FileSystemFinder',
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
'compressor.finders.CompressorFinder',
)
在我的基本模板:
{% compress css %}
<link rel="stylesheet" href="{% static 'css/app.css' %}">
{% block css %}{% endblock %}
{% endcompress %}
[...]
{% compress js %}
<script src="{% static 'js/main.js' %}"></script>
{% block js %}{% endblock js %}
{% endcompress %}
同样,将它们移出压缩块可以解决问题。只是找不到压缩的文件。
任何想法?
编辑
我忘了提一个设置我加为每deployment checklist,即这样的: https://docs.djangoproject.com/en/1.8/ref/templates/api/#django.template.loaders.cached.Loader
TEMPLATES[0]['OPTIONS']['loaders'] = [
(
'django.template.loaders.cached.Loader', [
'django.template.loaders.filesystem.Loader',
'django.template.loaders.app_directories.Loader',
]
),
]
删除此设置又使得网页的工作。然而,JS和CSS文件没有被压缩......发生了什么事?
这似乎是一个已知的问题。
根据Squebe的说法:“Compressor的在线模式在Heroku上不起作用,因为Whitenoise只在应用程序加载时检查静态文件夹(请参阅我对问题#680的评论)。在生产中使用压缩机时,我认为您需要在离线模式下使用它,并在应用程序使用Heroku的后编译钩子加载之前运行python manage.py compress。“
我明白了,谢谢你的信息。与此同时,我转而使用django-pipeline,它可以开箱即用! – cpury
我也会这么做,谢谢 – Ryan
谢谢@Ryan。这对我有效。以防其他人需要它:只需在你的'bin/post_compile'处添加[this file]的内容(https://github.com/nigma/heroku-django-cookbook/blob/master/bin/run_compress)回购 - 至少这对我来说是诀窍。另外,因为我使用'。buildpacks'和我需要'bower_components'在_compression_之前存在,我颠倒了顺序,让NodeJS在第一行和Python在第二行在'.buildpacks'。 – cuducos
我有像你这样的确切问题,但不是在Heroku上。我使用django cookiecutter项目,但问题是相同的。 “CACHE”文件夹中的任何文件都会返回一个404.任何想法为什么? –