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.
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.
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 ...
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.
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.
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/'
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
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')
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.
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.