【问题标题】:Whitenoise and django-compressor cause 404 for compressed filesWhitenoise 和 django-compressor 导致压缩文件出现 404
【发布时间】:2016-01-11 08:49:12
【问题描述】:

尝试使用 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) 的重复:

  • 我的问题来自 django-compressor,而不仅仅是白噪声
  • 他们得到的不是 404,而是 500。
  • 他们的问题是他们忘记运行 collectstatic...这里不是这种情况。

【问题讨论】:

标签: python django heroku django-compressor


【解决方案1】:

这似乎是一个已知问题。

根据 Squebe -“Compressor 的在线模式在 Heroku 上不起作用,因为 Whitenoise 仅在加载应用程序时检查静态文件夹(请参阅我对问题 #680 的评论)。要在生产中使用压缩器,我认为您需要使用它在离线模式下运行 python manage.py compress 在应用程序加载之前使用 Heroku 的 post compile hook。

No way to get this to work on Heroku #486

【讨论】:

  • 我明白了,谢谢你的信息。与此同时,我切换到 django-pipeline,它开箱即用!
  • 谢谢,@Ryan。这对我有用。以防万一其他人需要它:只需将 this file 的内容添加到您的 repo 中的 bin/post_compile — 至少这对我来说是诀窍。另外,当我使用.buildpacks 并且我需要bower_components 在压缩 之前存在时,我颠倒了顺序,让NodeJS 在第1 行,Python 在第2 行.buildpacks。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-01
  • 1970-01-01
  • 2013-05-13
  • 1970-01-01
  • 2018-03-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多