启用WhiteNoise时,'collectstatic'命令失败

时间:2014-11-09 14:50:17

标签: python django python-3.x static-files

我正按照WhiteNoise的建议,尝试通过Heroku提供静态文件。当我在开发环境中运行collectstatic时,会发生这种情况:

Post-processing 'css/iconic/open-iconic-bootstrap.css' failed!

Traceback (most recent call last):
  File "./manage.py", line 10, in <module>
    execute_from_command_line(sys.argv)
  File "/home/Pieter/.virtualenvs/radiant/lib/python3.4/site-packages/django/core/management/__init__.py", line 385, in execute_from_command_line
    utility.execute()
  File "/home/Pieter/.virtualenvs/radiant/lib/python3.4/site-packages/django/core/management/__init__.py", line 377, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/home/Pieter/.virtualenvs/radiant/lib/python3.4/site-packages/django/core/management/base.py", line 288, in run_from_argv
    self.execute(*args, **options.__dict__)
  File "/home/Pieter/.virtualenvs/radiant/lib/python3.4/site-packages/django/core/management/base.py", line 338, in execute
    output = self.handle(*args, **options)
  File "/home/Pieter/.virtualenvs/radiant/lib/python3.4/site-packages/django/core/management/base.py", line 533, in handle
    return self.handle_noargs(**options)
  File "/home/Pieter/.virtualenvs/radiant/lib/python3.4/site-packages/django/contrib/staticfiles/management/commands/collectstatic.py", line 168, in handle_noargs
    collected = self.collect()
  File "/home/Pieter/.virtualenvs/radiant/lib/python3.4/site-packages/django/contrib/staticfiles/management/commands/collectstatic.py", line 120, in collect
    raise processed
  File "/home/Pieter/.virtualenvs/radiant/lib/python3.4/site-packages/django/contrib/staticfiles/storage.py", line 242, in post_process
    content = pattern.sub(converter, content)
  File "/home/Pieter/.virtualenvs/radiant/lib/python3.4/site-packages/django/contrib/staticfiles/storage.py", line 181, in converter
    hashed_url = self.url(unquote(joined_result), force=True)
  File "/home/Pieter/.virtualenvs/radiant/lib/python3.4/site-packages/django/contrib/staticfiles/storage.py", line 128, in url
    hashed_name = self.stored_name(clean_name)
  File "/home/Pieter/.virtualenvs/radiant/lib/python3.4/site-packages/django/contrib/staticfiles/storage.py", line 277, in stored_name
    cache_name = self.clean_name(self.hashed_name(name))
  File "/home/Pieter/.virtualenvs/radiant/lib/python3.4/site-packages/django/contrib/staticfiles/storage.py", line 91, in hashed_name
    (clean_name, self))
ValueError: The file 'css/fonts/open-iconic.eot' could not be found with <whitenoise.django.GzipManifestStaticFilesStorage object at 0x7f57fc5b1550>.

当我在我的设置中注释掉这一行时,静态收集命令无故障地运行:

STATICFILES_STORAGE = 'whitenoise.django.GzipManifestStaticFilesStorage'

这里出了什么问题,我该如何解决?我已经尝试清空我的静态文件输出文件夹。它运行顺利,直到它开始处理一个特定文件。

14 个答案:

答案 0 :(得分:16)

此处的问题是css/iconic/open-iconic-bootstrap.css引用了一个文件open-iconic.eot,该文件并不存在于预期的位置。

当您使用该存储后端运行collectstatic时,Django会尝试重写CSS文件中的所有URL,以便他们通过新名称引用文件,例如css/iconic/open-iconic.8a7442ca6bed.eot。如果它无法找到该文件,则会因该错误而停止。

答案 1 :(得分:8)

我刚遇到同样的问题并通过从我的设置文件

中删除此行来解决此问题
STATICFILES_STORAGE = 'whitenoise.django.GzipManifestStaticFilesStorage'

我从Heroku文档页面获得了这一行......

答案 2 :(得分:7)

当我所有的.css文件都存在时,我有这个错误声称缺少.css文件,因为我信任Heroku文档:

STATIC_ROOT = 'staticfiles'

通过WhiteNoise文档:

STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')

修复很简单,但在Heroku修复他们的文档(我提交了反馈)之前,请确保解决方案至少出现在SO中。

答案 3 :(得分:3)

这里的问题是使用

$final = array(); $search_for = '<POPULARITY URL'; $part = file_get_contents_curl('http://data.alexa.com/data?cli=10&dat=snbamz&url='.trim($domain)); $str = explode($search_for, $part); //ERROR HAPPENS HERE// $str = array_shift(explode('"/>', $str[1])); $str = explode('TEXT="', $str); $str[1] = str_replace('" SOURCE="panel',"",$str[1]); preg_match('#<COUNTRY CODE="(.*?)" NAME="(.*?)" RANK="(.*?)"#si', $part, $c); $final['global_rank'] = $str[1]; $final['country_name'] = $c[2]; $final['country_rank'] = $c[3]; return $final;

STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'

以不同于runserver的方式使用Django的静态文件存储。有关解释,请参阅Django文档:https://docs.djangoproject.com/en/1.11/ref/contrib/staticfiles/#django.contrib.staticfiles.storage.ManifestStaticFilesStorage.manifest_strict

我相信在运行collectstatic时会引用引用的清单,因此这样做会暂时解决此问题,但如果您修改了任何静态文件,则可能不希望在每次测试运行之前运行collectstatic。另一种解决方案是为测试禁用此设置,并在生产中运行它。

答案 4 :(得分:2)

在开发中,Django的runserver 自动接管静态文件处理。

在大多数情况下,这很好,但是这意味着WhiteNoise对静态文件处理所做的某些改进在开发中将不可用,这为开发和生产环境之间的行为差​​异提供了可能性。因此,在开发中也使用WhiteNoise是个好主意。

您可以通过将--nostatic选项传递给runserver命令来禁用Django的静态文件处理,并允许WhiteNoise接管,但是您需要记住每次调用runserver时都要添加此选项。一种更简单的方法是编辑您的settings.py文件,并将whitenoise.runserver_nostatic添加到INSTALLED_APPS列表的顶部:

INSTALLED_APPS = [
'whitenoise.runserver_nostatic',
'django.contrib.staticfiles',
# ...]

来源-http://whitenoise.evans.io/en/stable/django.html#using-whitenoise-in-development

答案 5 :(得分:1)

对我来说,修复只是添加一个静态的&#39;文件夹到顶级目录(myapp / static做了伎俩)。如果您正在设置STATIC_URL但尚未创建该目录,则即使您没有将该目录用于具有whitenoise的静态文件,也会引发错误。

STATIC_URL = '/static/'

答案 6 :(得分:1)

我有类似的问题,但有一点麻烦。

我部署在pythonanywhere上。如果我调试True,app运行正常。但如果转弯调试False,应用程序崩溃时会出现一行错误,即一行是摘要

<div *ngFor="let set of sets.array"> <p>{{set.name}}</p> <p>{{set.title}}</p> </div>

我从ValueError: Missing staticfiles manifest entry for 'favicons/favicon.ico'更改为STATIC_ROOT = 'staticfiles

删除了STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')目录,然后重新运行staticfiles

现在app运行良好

答案 7 :(得分:0)

通过在生产中的settings.py中评论whitenoise,它对我有用。

python-3.6.2

答案 8 :(得分:0)

我整天都在处理这个问题。原来问题是staticfiles目录未签到git。我在该目录中创建了一个虚拟文件,将其检入,一切都很好。我相信,在Whitenoise文档中也提到了这一点。

答案 9 :(得分:0)

请确保检查与静态文件相关的所有设置,尤其要确保路径指向正确的位置。我个人的STATICFILES_DIRS中有一个指向错误的路径。

答案 10 :(得分:0)

与其他所有人一样,我对此问题有一个独特的解决方案……事实证明,我的url()文件中有一个styles.css,语法错误。

一旦我更改:

background-image: url( '../images/futura_front_blank_medium.jpg' );

background-image: url('../images/futura_front_blank_medium.jpg');

(注意细微的区别-我删除了字符串两侧的空格)

然后python manage.py collectstatic正常工作,但我没有收到该错误。

答案 11 :(得分:0)

whitenoise.django.GzipManifestStaticFilesStorage别名现已被删除。相反,您应该使用正确的导入路径:whitenoise.storage.CompressedManifestStaticFilesStorage

根据文档here

答案 12 :(得分:0)

就我而言,还有另一种解决方案。在Heroku的配置中,我有一个设置:

DISABLE_COLLECTSTATIC = 0

应该让Heroku通过推送到heroku master来自动收集静态信息,但是没有!

我所做的是在

上删除此设置

-3600 <= pd.Timedelta(days=-1, hours=23).total_seconds() <= 3600 True

之后,Heroku自动收集了静态文件,问题消失了。

答案 13 :(得分:0)

有两种选择:

  1. 添加CSS中正确的链接
  2. 通过删除CSS中不存在的文件链接