Django-Compressor lance UncompressableFileError
J'utilise django-compressor et django-staticfiles (la version externe, je suis sur Django 1.2).
Quand j'essaye de charger mon site, j'obtiens une erreur:
TemplateSyntaxError: Caught UncompressableFileError while rendering: 'css/facebox.css' isn't accesible via COMPRESS_URL ('/static/') and can't be compressed
J'ai vérifié que {[5] } est égal à STATIC_URL
, et le fichier est réellement accessible à cette URL.
En regardant le code django-compressor, j'ai trouvé où cette exception est levée:
def get_basename(self, url):
try:
base_url = self.storage.base_url
except AttributeError:
base_url = settings.COMPRESS_URL
# I added the following print statement:
print "url: %s, base_url: %s" % (url, base_url)
if not url.startswith(base_url):
raise UncompressableFileError("'%s' isn't accesible via "
"COMPRESS_URL ('%s') and can't be "
"compressed" % (url, base_url))
Le premier bloc {% compress css %}
dans Mes modèles est le suivant:
{% compress css %}
<link rel="stylesheet" href="/static/css/blueprint/screen.css" type="text/css" />
<link rel="stylesheet" type="text/css" href="{{ STATIC_URL }}css/facebox.css" />
{% endcompress %}
(notez que le premier lien n'utilise pas {{ STATIC_URL }}
, mais le deuxième)
Et je reçois ceci dans mon journal des erreurs:
[Thu Oct 13 08:19:13 2011] [error] url: /static/css/blueprint/screen.css, base_url: /static/
[Thu Oct 13 08:19:13 2011] [error] url: /static/css/facebox.css, base_url: /static/
[Thu Oct 13 08:19:14 2011] [error] url: /static/css/blueprint/screen.css, base_url: /static/
[Thu Oct 13 08:19:14 2011] [error] url: css/facebox.css, base_url: /static/
Comme vous pouvez le voir, l'écran.le fichier css est traité deux fois et réussi la deuxième fois. La facebox.le fichier css échoue cependant la deuxième fois, présumable car {{ STATIC_URL }}
n'est pas défini dans le contexte du modèle la deuxième fois que le fichier est analysé.
, Évidemment, je pourrais résoudre le problème en n'utilisant pas {{ STATIC_URL }}
, mais ce n'est pas une solution acceptable.
Pourquoi mes fichiers css seraient-ils traités deux fois? Ils avaient à l'origine media='screen, projection'
, mais j'ai supprimé cela en pensant que cela causait le problème.
Paramètres pertinents:
In [4]: from compressor.conf import settings
In [5]: settings.COMPRESS_ROOT
Out[5]: '/home/ianchat/static_files'
In [6]: settings.STATIC_ROOT
Out[6]: '/home/ianchat/static_files'
In [7]: settings.COMPRESS_URL
Out[7]: '/static/'
In [8]: settings.STATIC_URL
Out[8]: '/static/'
In [9]: settings.COMPRESS_OUTPUT_DIR
Out[9]: 'CACHE'
In [10]: settings.COMPRESS_CSS_FILTERS
Out[10]: ['compressor.filters.csstidy.CSSTidyFilter']
In [11]: settings.STATICFILES_FINDERS
Out[11]:
('staticfiles.finders.FileSystemFinder',
'staticfiles.finders.AppDirectoriesFinder',
'staticfiles.finders.LegacyAppDirectoriesFinder',
'compressor.finders.CompressorFinder')
6 réponses
Je suis tombé sur le même problème.
La réponse a été trouvée ici: https://github.com/jezdez/django_compressor/pull/206 La solution du lien fait handler500. J'ai décidé de changer 500.modèle html pour éviter tout {{STATIC_URL}} en elle et le problème a été résolu.
Il semble presque que STATIC_URL ne soit pas dans votre contexte. Vous avez configuré le staticfiles contextprocessor, n'est-ce pas? Avez-vous essayé d'aimer le fichier sans les balises compressor? Est-ce que {{STATIC_URL }} apparaît correctement dans la page lorsque vous la chargez?
Je pense que compressor vérifie l'url même s'il y accède via le système de fichiers en regardant https://github.com/jezdez/django_compressor/blob/develop/compressor/base.py#L57
C'est une vieille question, mais l'un des rares résultats de recherche lors de la recherche de ce message d'erreur, il pourrait donc être utile de partager ma solution.
Dans mon cas, c'était un cas simple mort: j'ai codé en dur mon url statique et j'ai oublié le /
Au début. J'ai donc eu ceci:
<link type="text/css" rel="stylesheet" href="static/style.css" />
, Qui m'a donné l'erreur. Après avoir changé à ceci:
<link type="text/css" rel="stylesheet" href="/static/style.css" />
C'était réparé. Bien sûr, j'ai réalisé plus tard, j'aurais dû utiliser le paramètre STATIC_URL:
<link type="text/css" rel="stylesheet" href="{{ STATIC_URL }}style.css" />
J'espère que cela aide quiconque.
Je l'ai regardé un peu plus et je suis à peu près sûr que l'exception est causée en essayant d'afficher une page d'erreur non corrigée sans le contexte complet du premier passage. Cela provoque l'exception dans django-compressor.[1]
La solution, bien sûr, est de gérer toutes les erreurs.
[1] j'exécute également du code non standard pour afficher des pages statiques, peut-être que cela interfère et la raison pour laquelle le bug n'est pas trop commun.
J'ai rencontré le même problème; dans mon cas, le problème a été causé en utilisant COMPRESS_OFFLINE_CONTEXT
- qui ne .update()
le contexte mais il le remplace complètement, supprimant ainsi STATIC_URL
.
La solution dans mon cas était juste de l'ajouter à la COMPRESS_OFFLINE_CONTEXT
, après l'importation local_settings, sinon toute substitution n'aurait pas fonctionné.
Semble que votre settings.COMPRESS_URL
doit être statique à partir de votre système, pas de l'url elle-même.
Essayez de changer à vos paramètres la valeur COMPRESS_URL
à:
# in case your static is on same level than settings.py (usually are)
COMPRESS_URL = r'%s/static' % os.path.abspath(os.path.dirname(__file__))
Veuillez mettre à jour votre journal des erreurs avec les nouvelles informations ou sur mes commentaires de réponse.