ValueError: Missing staticfiles manifest entry for 'favicon.ico'

非 Y 不嫁゛ 提交于 2019-11-28 06:47:43

Try running:

python manage.py collectstatic

Does the test work now? If so, this might be the configuration causing a problem:

STATICFILES_STORAGE = 'whitenoise.django.GzipManifestStaticFilesStorage'

Related:
https://stackoverflow.com/a/32347324/2596187

Check out the Django documentation: https://docs.djangoproject.com/en/1.11/ref/contrib/staticfiles/#django.contrib.staticfiles.storage.ManifestStaticFilesStorage.manifest_strict

If you want to continue to use the WhiteNoise module in your Django 1.11 (or newer) project while preventing this "Missing staticfiles manifest entry" error, you need to disable the manifest_strict attribute by means of inheritance, as noted in Django documentation.

How to accomplish that?

Firstly, create a storage.py file in your project directory:

from whitenoise.storage import CompressedManifestStaticFilesStorage


class WhiteNoiseStaticFilesStorage(CompressedManifestStaticFilesStorage):
    manifest_strict = False

Secondly, edit the STATICFILES_STORAGE constant in your settings.py file to point to this new class, such as:

STATICFILES_STORAGE = 'my_project.storage.WhiteNoiseStaticFilesStorage'
Vladimir

That not necessarily happens with whitenoise package. Changing STATIC_STORAGE to django.contrib.staticfiles.storage.ManifestStaticFilesStorage will produce the same error while running tests starting with Django 1.11.

That happens because ManifestStaticFilesStorage expects staticfiles.json to exist and contain the file asked. You can confirm this by running ./manage.py collectstatic and trying again.

You don't generally see this error in development because when DEBUG == True, ManifestStaticFilesStorage switches to non-hashed urls.

To overcome this you've got to make sure that:

STATICFILES_STORAGE = 'django.contrib.staticfiles.storage.StaticFilesStorage'

Which is the default.

One way would be to override settings for the test class:

from django.test import TestCase, override_settings
@override_settings(STATICFILES_STORAGE='django.contrib.staticfiles.storage.StaticFilesStorage')
class MyTest(TestCase):
    pass

or the method:

from django.test import TestCase, override_settings
class MyTest(TestCase):
    @override_settings(STATICFILES_STORAGE='django.contrib.staticfiles.storage.StaticFilesStorage')
    def test_something(self):
        pass
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!