Django-Compressor выдает ошибку несжимаемого файла

#django #django-staticfiles #django-compressor

#django #django-staticfiles #django-compressor

Вопрос:

Я использую django-compressor и django-staticfiles (внешняя версия, я на Django 1.2).

Когда я пытаюсь загрузить свой сайт, я получаю сообщение об ошибке:

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

Я проверил COMPRESS_URL , равно STATIC_URL , и файл действительно доступен по этому URL.

Просматривая код django-compressor, я обнаружил, где генерируется это исключение:

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

Первый {% compress css %} блок в моих шаблонах — это:

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

(Обратите внимание, что первая ссылка не используется {{ STATIC_URL }} , но вторая используется)

И я получаю это в своем журнале ошибок:

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

Как вы можете видеть, файл screen.css обрабатывается дважды, и во второй раз успешно. Однако файл facebox.css завершается с ошибкой во второй раз, предположительно потому, что он {{ STATIC_URL }} не определен в контексте шаблона при втором анализе файла.

Очевидно, я мог бы решить проблему, не используя {{ STATIC_URL }} , но это неприемлемое решение.

Почему мои файлы css обрабатываются дважды? Изначально они были media='screen, projection' , но я удалил это, думая, что это вызывает проблему.

Соответствующие настройки:

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

Комментарии:

1. Ошибка кажется мне несколько неуловимой. Я использую Django 1.3 на gunicorn. (Большой) Возможно, это вызвано необработанным исключением где-то в другом месте.

2. Точно такая же проблема здесь, вы нашли решение?

3. Нет, так и не нашел решения. В итоге я использовал django-mediagenerator, который я не большой поклонник, но он работал.

Ответ №1:

Я столкнулся с той же проблемой.

Ответ был найден здесь: https://github.com/jezdez/django_compressor/pull/206 Решение ссылки — это выполнение handler500. Я решил изменить 500.html шаблон, чтобы избежать каких-либо {{STATIC_URL}} в нем, и проблема была решена.

Ответ №2:

Похоже, что STATIC_URL отсутствует в вашем контексте. У вас настроен контекстный процессор staticfiles, верно? Вы пытались поставить лайк файлу без тегов compressor? Правильно ли отображается {{ STATIC_URL }} на странице при ее загрузке?

Я думаю, что compressor проверяет URL-адрес, даже если он обращается к нему через файловую систему, просматривая https://github.com/jezdez/django_compressor/blob/develop/compressor/base.py#L57

Комментарии:

1. Да, вы описали проблему .. посмотрите на последнюю строку в моем журнале ошибок (который был создан путем добавления инструкции print к функции, которую вы упомянули здесь). Вы увидите, что URL-адрес /css/facebox.css, но base_url /static/ . URL неверен, потому что он не начинается с base_url , поэтому генерируется исключение. Однако журнал ошибок также показывает, что файл обрабатывается дважды, и {{ STATIC_URL }} добавляется правильно с первого раза. Страница нормально загружается без тегов компрессора.

Ответ №3:

Это старый вопрос, но один из немногих результатов поиска при поиске этого сообщения об ошибке, поэтому, возможно, стоит поделиться моим решением.

В моем случае это был очень простой случай: я жестко запрограммировал свой статический URL и забыл / в начале. Итак, у меня было это:

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

Что дало мне ошибку. После изменения на это:

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

Это было исправлено. Конечно, позже я понял, что мне следовало использовать параметр STATIC_URL:

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

Надеюсь, это кому-нибудь поможет.

Ответ №4:

Я посмотрел на это еще немного, и я почти уверен, что исключение вызвано попыткой отобразить страницу с неучтенной ошибкой без полного контекста, который был у первого прохода. Это вызывает исключение в django-compressor.[1]

Решение, конечно, заключается в обработке всех ошибок.

[1] Я также использую некоторый нестандартный код для отображения статических страниц, возможно, это мешает и причина того, что ошибка не слишком распространена.

Ответ №5:

Я столкнулся с той же проблемой; в моем случае проблема была вызвана использованием COMPRESS_OFFLINE_CONTEXT — что не .update() соответствует контексту, но полностью заменяет его, тем самым удаляя STATIC_URL . Решением в моем случае было просто добавить его обратно в COMPRESS_OFFLINE_CONTEXT , после импорта local_settings, иначе любое переопределение там не сработало бы.