可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I'm trying to serve static files through WhiteNoise as per Heroku's recommendation. When I run collectstatic
in my development environment, this happens:
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>.
The static collection command runs without incident when I comment out this line in my settings:
STATICFILES_STORAGE = 'whitenoise.django.GzipManifestStaticFilesStorage'
What's going wrong here and how do I fix it? I already tried emptying my static file output folder. It runs smoothly until it starts processing one specific file.
回答1:
The problem here is that css/iconic/open-iconic-bootstrap.css
is referencing a file, open-iconic.eot
, which doesn't exist in the expected location.
When you run collectstatic
with that storage backend Django attempts to rewrite all the URLs in your CSS files so they reference the files by their new names e.g, css/iconic/open-iconic.8a7442ca6bed.eot
. If it can't find the file it stops with that error.
回答2:
I just had this same issue and fixed it by removing this line from my settings file,
STATICFILES_STORAGE = 'whitenoise.django.GzipManifestStaticFilesStorage'
I got this line from the Heroku documentation page...
回答3:
I've had this error claiming a missing .css file when all my .css files existed, because I trusted Heroku documentation:
STATIC_ROOT = 'staticfiles'
over WhiteNoise documentation:
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
The fix is trivial, but until Heroku fix their docs (I submitted feedback), lets make sure the solution at least appears in SO.
回答4:
The issue here is that using
STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'
or
STATICFILES_STORAGE = 'django.contrib.staticfiles.storage.ManifestStaticFilesStorage
uses Django's static file storage in a different way than runserver does. See the Django docs for some explanation: https://docs.djangoproject.com/en/1.11/ref/contrib/staticfiles/#django.contrib.staticfiles.storage.ManifestStaticFilesStorage.manifest_strict
I believe the referenced manifest gets built when you run collectstatic, so doing so should fix this problem temporarily, but you likely don't want to run collectstatic before every test run if you have modified any static files. Another solution would be to disable this setting for your tests, and just run it in production.
回答5:
I had similar problem, but with a twist.
I deployed on pythonanywhere. If I turn debug True, app runs fine. But if a turn debug False, app crashes with a error that with one line being the summary
ValueError: Missing staticfiles manifest entry for 'favicons/favicon.ico'
I changed from STATIC_ROOT = 'staticfiles
to STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
Deleted staticfiles
directory, then rerun python manage.py collectstatic
.
Now app runs fine
回答6:
For me the fix was simply adding a 'static' folder to the top directory (myapp/static did the trick). If you are setting the STATIC_URL but don't have that directory already created, it will throw an error, even though you aren't using that directory for your static files with whitenoise.
STATIC_URL = '/static/'
回答7:
It worked for me by commenting out the whitenoise in settings.py in production.
#STATICFILES_STORAGE = 'whitenoise.django.GzipManifestStaticFilesStorage'
#WHITENOISE_ROOT = os.path.join(BASE_DIR, 'staticfiles')
回答8:
I've been dealing with this issue all day. It turns out the problem was the staticfiles
directory was not checked in to git. I created a dummy file inside this directory, checked it in and everything was fine. This was mentioned somewhere in the Whitenoise documentation too, I believe.
回答9:
Be sure to check all your settings related to static files, especially making sure the paths are pointing to the right locations. I personally had one of my STATICFILES_DIRS
pointing to a wrong path.
回答10:
Much like everyone else, I had a unique fix to this problem... turns out I had a url()
in my styles.css
file with bad syntax.
Once I changed:
background-image: url( '../images/futura_front_blank_medium.jpg' );
to
background-image: url('../images/futura_front_blank_medium.jpg');
(notice the subtle difference -- I removed the spaces on either side of the string)
then python manage.py collectstatic
worked fine and I didn't get that error.
回答11:
The whitenoise.django.GzipManifestStaticFilesStorage
alias has now been removed. Instead you should use the correct import path: whitenoise.storage.CompressedManifestStaticFilesStorage
.
As per the doc here.