Django-Compressor throws UncompressableFileError

Chris Lawlor picture Chris Lawlor · Oct 13, 2011 · Viewed 12k times · Source

I'm using django-compressor and django-staticfiles (the external version, I'm on Django 1.2).

When I try to load my site, I get an error:

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

I've verified COMPRESS_URL is equal to STATIC_URL, and the file is actually accessible at that URL.

Looking at the django-compressor code, I found where that exception is thrown:

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

The first {% compress css %} block in my templates is this:

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

(Note that the first link doesn't use {{ STATIC_URL }}, but the second one does)

And I get this in my error log:

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

As you can see, the screen.css file is processed twice, and successful the second time around. The facebox.css file, however, fails the second time, presumable because the {{ STATIC_URL }} isn't defined in the template context the second time the file is parsed.

Obviously I could solve the problem by not using {{ STATIC_URL }}, but that is not an acceptable solution.

Why would my css files be processed twice? They originally had media='screen, projection', but I removed that thinking it was causing the problem.

Relevant settings:

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

Answer

igolkotek picture igolkotek · Jun 24, 2012

I bumped into the same issue.

The answer was found here: https://github.com/jezdez/django_compressor/pull/206 The link's solution is doing handler500. I decided to change 500.html template to avoid any {{STATIC_URL}} in it and the problem was solved.