尝试使用 whitenoise 和 django-compressor 将Django应用程序部署到Heroku。
使用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文件没有被压缩......发生了什么?
修改2
这不是Django staticfiles not found on Heroku (with whitenoise)的重复:
答案 0 :(得分:7)
这似乎是一个已知问题。
根据Squebe的说法 - “Compressor的在线模式在Heroku上不起作用,因为Whitenoise只在加载应用程序时检查静态文件夹(请参阅我对问题#680的评论)。在生产中使用压缩器我觉得你需要使用它在离线模式下运行python manage.py压缩,然后使用Heroku的post编译钩子加载应用程序。“