白噪声和Django压缩器导致压缩文件出现404错误。

4
尝试使用 whitenoisedjango-compressor 将 Django 应用程序部署到 Heroku。在生产环境下,启用 DEBUG = FalseCOMPRESS_ENABLED = True 后,可以访问所有静态资源,但是所有压缩文件都返回 404 错误,例如:

http://*.herokuapp.com/static/CACHE/css/fbfaa35dc638.css Failed to load resource: the server responded with a status of 404 (NOT FOUND)

启用 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 %}

再次提醒,将它们移出压缩块可以解决这个问题。只是找不到压缩文件。

有什么想法吗?

编辑

我忘记提到一个设置,根据部署清单,我添加了这个设置: 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在Heroku上静态文件找不到的重复问题(使用whitenoise)

  • 我的问题源于django-compressor,而不仅仅是whitenoise
  • 他们没有得到404错误,而是500错误。
  • 他们的问题是忘记运行collectstatic……而这不是这里的情况。

我和你有完全相同的问题,但不是在Heroku上。我使用django cookiecutter项目,但问题是一样的。 "CACHE"文件夹中的任何文件都会返回404错误。有什么想法为什么会这样? - Özer
可能是[Django静态文件在Heroku上找不到(使用whitenoise)]的重复问题(https://dev59.com/RVsW5IYBdhLWcg3wCDTF)。 - lmiguelvargasf
1个回答

9
这似乎是一个已知的问题。
根据Squebe 的说法:“Compressor 的在线模式在Heroku 上无法工作,因为 Whitenoise 只在应用程序加载时检查静态文件夹(请参见我在 #680 问题上的评论)。要在生产中使用压缩器,我认为您需要在离线模式下使用它,并在使用 Heroku 的后编译挂钩加载应用程序之前运行 python manage.py compress。” 无法在 Heroku 上让其工作 #486

我明白了,谢谢你提供的信息。与此同时,我已经转向使用django-pipeline,它可以直接运行! - cpury
4
谢谢,@Ryan。对我很有用。以防其他人需要:只需将[this file](https://github.com/nigma/heroku-django-cookbook/blob/master/bin/run_compress)的内容添加到您的存储库中的`bin/post_compile`中 - 至少这对我很有效。此外,由于我使用.buildpacks并且在进行压缩前需要存在bower_components,因此我倒置了顺序,让NodeJS位于第1行,Python位于第2行,放在.buildpacks中。 - cuducos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接