Whitenoise和django压缩器导致404压缩文件

时间:2015-10-13 14:34:02

标签: python django heroku django-compressor

尝试使用 whitenoise django-compressor 将Django应用程序部署到Heroku。

使用DEBUG = FalseCOMPRESS_ENABLED = True将其部署到生产环境,可以毫无问题地访问我的所有静态资产。但是,所有压缩文件都返回404,例如:

  

http://*.herokuapp.com/static/CACHE/css/fbfaa35dc638.css失败   加载资源:服务器响应状态为404(未找到)

启用DEBUG或禁用COMPRESS_ENABLED可以解决问题,但当然不是我想要的。

我还设置STATICFILES_STORAGE = 'whitenoise.django.GzipManifestStaticFilesStorage',但更改此功能并不会有帮助。

某些设置(请注意我有一个设置目录,例如base.pylocal.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)的重复:

  • 我的问题出现的问题来自django-compressor,而不仅仅是whitenoise
  • 他们没有获得404,而是500s。
  • 他们的问题是他们忘了跑上收集......这不是这种情况。

1 个答案:

答案 0 :(得分:7)

这似乎是一个已知问题。

根据Squebe的说法 - “Compressor的在线模式在Heroku上不起作用,因为Whitenoise只在加载应用程序时检查静态文件夹(请参阅我对问题#680的评论)。在生产中使用压缩器我觉得你需要使用它在离线模式下运行python manage.py压缩,然后使用Heroku的post编译钩子加载应用程序。“

No way to get this to work on Heroku #486