Django-Compressor throws UncompressableFileError

13k Views Asked by At

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

There are 5 best solutions below

0
On BEST ANSWER

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.

1
On

It almost looks like STATIC_URL is not in your context. You do have the staticfiles contextprocessor configured, right? Have you tried to like the file without the compressor tags? Does {{ STATIC_URL }} show up correctly in the page when you load it?

I think compressor checks the url even if it accesses it through the file system looking at https://github.com/jezdez/django_compressor/blob/develop/compressor/base.py#L57

0
On

I've look at it some more and I'm pretty sure the exception is caused by trying to display an uncatched error page without the full context the first pass had. This causes the exception in django-compressor.[1]

The solution, of course, is to handle all errors.

[1] I'm also running some non-standard code to display static pages, maybe this interferes and the reason that the bug is not too common.

0
On

I ran into the same issue; in my case the problem was caused by using COMPRESS_OFFLINE_CONTEXT - which does not .update() the context but it replaces it altogether, thus removing STATIC_URL. The solution in my case was just adding it back to the COMPRESS_OFFLINE_CONTEXT, after the local_settings import, otherwise any override there wouldn't have worked.

0
On

This is an old question, but one of the few search results when searching for this error message, so it might be worth someting to share my solution.

In my case it was a dead simple case: I hardcoded my static url and forgot the / at the beginning. So I had this:

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

Which gave me the error. After changing to this:

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

It was fixed. Of course, I later realised, I should have used the setting STATIC_URL:

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

Hope this helps anyone.