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

问题描述:

试图部署Django应用程序到Heroku使用whitenoisedjango压缩机Whitenoise和Django压缩器导致404压缩文件

通过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文件没有被压缩......发生了什么事?

+0

我有像你这样的确切问题,但不是在Heroku上。我使用django cookiecutter项目,但问题是相同的。 “CACHE”文件夹中的任何文件都会返回一个404.任何想法为什么? –

这似乎是一个已知的问题。

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

No way to get this to work on Heroku #486

+0

我明白了,谢谢你的信息。与此同时,我转而使用django-pipeline,它可以开箱即用! – cpury

+0

我也会这么做,谢谢 – Ryan

+4

谢谢@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