compressor django django-staticfiles django-compressor

django compressor css



Django-Compressor lanza UncompressableFileError (6)

Casi parece que STATIC_URL no está en tu contexto. Usted tiene configurado el procesador de contexto staticfiles, ¿verdad? ¿Has intentado que me guste el archivo sin las etiquetas de compresor? ¿Aparece {{STATIC_URL}} correctamente en la página cuando lo carga?

Creo que el compresor comprueba la url incluso si accede a través del sistema de archivos en https://github.com/jezdez/django_compressor/blob/develop/compressor/base.py#L57

Estoy usando django-compressor y django-staticfiles (la versión externa, estoy en Django 1.2).

Cuando intento cargar mi sitio, recibo un error:

TemplateSyntaxError: Caught UncompressableFileError while rendering: ''css/facebox.css'' isn''t accesible via COMPRESS_URL (''/static/'') and can''t be compressed

He verificado que COMPRESS_URL es igual a STATIC_URL , y el archivo es realmente accesible en esa URL.

Mirando el código del compresor django, encontré dónde se produce esa excepción:

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

El primer bloque {% compress css %} en mis plantillas es este:

{% 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 %}

(Tenga en cuenta que el primer enlace no usa {{ STATIC_URL }} , pero el segundo sí lo hace)

Y consigo esto en mi registro de errores:

[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/

Como puede ver, el archivo screen.css se procesa dos veces y se realiza correctamente la segunda vez. Sin embargo, el archivo facebox.css falla la segunda vez, presumiblemente porque {{ STATIC_URL }} no está definido en el contexto de la plantilla la segunda vez que se analiza el archivo.

Obviamente, podría resolver el problema al no usar {{ STATIC_URL }} , pero esa no es una solución aceptable.

¿Por qué mis archivos css se procesan dos veces? Originalmente tenían media=''screen, projection'' , pero eliminé eso porque estaba causando el problema.

Ajustes relevantes:

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


Esta es una pregunta antigua, pero uno de los pocos resultados de búsqueda al buscar este mensaje de error, por lo que podría valer la pena compartir mi solución.

En mi caso, fue un caso simple muerto: codifiqué mi URL estática y olvidé el / al principio. Así que tuve esto:

<link type="text/css" rel="stylesheet" href="static/style.css" />

Lo que me dio el error. Después de cambiar a esto:

<link type="text/css" rel="stylesheet" href="/static/style.css" />

Fue arreglado Por supuesto, luego me di cuenta de que debería haber usado la configuración STATIC_URL:

<link type="text/css" rel="stylesheet" href="{{ STATIC_URL }}style.css" />

Espero que esto ayude a cualquiera.


Lo he examinado un poco más y estoy bastante seguro de que la excepción se debe a que intenta mostrar una página de error sin tramar sin el contexto completo que tenía el primer pase. Esto causa la excepción en django-compressor. [1]

La solución, por supuesto, es manejar todos los errores.

[1] También estoy ejecutando un código no estándar para mostrar páginas estáticas, tal vez esto interfiere y la razón por la que el error no es demasiado común.


Me encontré con el mismo problema; en mi caso, el problema fue causado por el uso de COMPRESS_OFFLINE_CONTEXT , que no .update() el contexto .update() sino que lo reemplaza por completo, eliminando así STATIC_URL . La solución en mi caso fue simplemente volver a agregarla a COMPRESS_OFFLINE_CONTEXT , después de la importación local_settings, de lo contrario, cualquier anulación no habría funcionado.


Me topé con el mismo problema.

La respuesta se encontró aquí: https://github.com/jezdez/django_compressor/pull/206 La solución del enlace está haciendo handler500. Decidí cambiar la plantilla 500.html para evitar cualquier {{STATIC_URL}} y el problema se resolvió.


Parece que tu settings.COMPRESS_URL necesita obtener estática de tu sistema, no del url en sí.

Intente cambiar en su configuración el valor COMPRESS_URL para:

# 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__))

Actualice su registro de errores con la nueva información o en mis comentarios de respuesta.