web-dev-qa-db-fra.com

La commande 'collectstatic' échoue lorsque WhiteNoise est activé

J'essaie de servir des fichiers statiques via WhiteNoise selon les recommandations de Heroku . Lorsque je lance collectstatic dans mon environnement de développement, cela se produit:

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>.

La commande de collecte statique s'exécute sans incident lorsque je commente cette ligne dans mes paramètres:

STATICFILES_STORAGE = 'whitenoise.Django.GzipManifestStaticFilesStorage'

Qu'est-ce qui ne va pas ici et comment puis-je résoudre ce problème? J'ai déjà essayé de vider mon dossier de sortie de fichier statique. Il fonctionne sans heurts jusqu'à ce qu'il commence à traiter un fichier spécifique.

20
Pieter

Le problème ici est que css/iconic/open-iconic-bootstrap.css fait référence à un fichier, open-iconic.eot, qui n'existe pas à l'emplacement prévu.

Lorsque vous exécutez collectstatic avec ce système de stockage, Django tente de réécrire toutes les URL de vos fichiers CSS afin de les référencer par leur nouveau nom, par exemple, css/iconic/open-iconic.8a7442ca6bed.eot. S'il ne peut pas trouver le fichier, il s'arrête avec cette erreur.

17
D. Evans

Je viens d'avoir ce même problème et corrigé en supprimant cette ligne de mon fichier de paramètres,

STATICFILES_STORAGE = 'whitenoise.Django.GzipManifestStaticFilesStorage'

J'ai eu cette ligne de la page de documentation Heroku ...

9
user772401

J'ai eu cette erreur en réclamant un fichier .css manquant alors que tous mes fichiers .css existaient, car j'avais confiance en la documentation Heroku:

STATIC_ROOT = 'staticfiles'

sur la documentation WhiteNoise:

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

Le correctif est simple, mais jusqu'à ce que Heroku corrige sa documentation (j'ai envoyé des commentaires), assurons-nous que la solution apparaît au moins dans SO.

7
Aur Saraf

Le problème ici est que l'utilisation de

STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'

ou 

STATICFILES_STORAGE = 'Django.contrib.staticfiles.storage.ManifestStaticFilesStorage

utilise le stockage de fichiers statiques de Django d’une manière différente de celle de runserver. Voir la documentation Django pour quelques explications: https://docs.djangoproject.com/fr/1.11/ref/contrib/staticfiles/#Django.contrib.staticfiles.storage.ManifestStaticFilesStorage.manifest_strict

Je crois que le manifeste référencé est construit lorsque vous exécutez collectstatic. Cela devrait donc résoudre ce problème temporairement, mais vous ne souhaitez probablement pas exécuter collectstatic avant chaque test si vous avez modifié des fichiers statiques. Une autre solution serait de désactiver ce paramètre pour vos tests et de l’exécuter en production.

3
Jeff

Pour moi, le correctif consistait simplement à ajouter un dossier 'statique' dans le répertoire principal (myapp/static a fait l'affaire). Si vous définissez STATIC_URL mais que vous n'avez pas créé ce répertoire, une erreur sera générée, même si vous n'utilisez pas ce répertoire pour vos fichiers statiques avec whitenoise.

STATIC_URL = '/static/'
1
Colton Hicks

J'ai eu un problème similaire, mais avec une torsion.

J'ai déployé sur pythonanywhere. Si j'active le débogage True, l'application fonctionne correctement. Mais si un tour débogue False, l'application se bloque avec une erreur avec une ligne comme résumé

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

J'ai changé de STATIC_ROOT = 'staticfiles à STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')

Supprimez le répertoire staticfiles, puis réexécutez python manage.py collectstatic.

Maintenant, l'application fonctionne bien

1
chidimo

Cela a fonctionné pour moi en commentant la blancheur dans settings.py en production.

#STATICFILES_STORAGE = 'whitenoise.Django.GzipManifestStaticFilesStorage'
#WHITENOISE_ROOT = os.path.join(BASE_DIR, 'staticfiles')
0
Taiwo O. Adetiloye

Assurez-vous de vérifier tous vos paramètres liés aux fichiers statiques, en vous assurant notamment que les chemins d'accès pointent aux bons emplacements. J'ai personnellement eu l'un de mes STATICFILES_DIRS pointant vers un mauvais chemin.

0
Karuhanga

J'ai traité de cette question toute la journée. Il se trouve que le problème était que le répertoire staticfiles n'avait pas été archivé dans git. J'ai créé un fichier factice dans ce répertoire, je l'ai archivé et tout s'est bien passé. Cela a été mentionné quelque part dans la documentation de Whitenoise aussi, je crois.

0
ravioli