Django-Compressor выдает UncompressableFileError - PullRequest
23 голосов
/ 13 октября 2011

Я использую django-compress и 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, я обнаружил, где выбрасывается это исключение:

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

Ответы [ 6 ]

6 голосов
/ 24 июня 2012

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

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

1 голос
/ 16 июня 2013

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

В моем случае это был очень простой случай:Я жестко закодировал свой статический 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" />

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

1 голос
/ 23 октября 2011

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

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

0 голосов
/ 08 декабря 2015

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

0 голосов
/ 28 декабря 2011

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

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

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

0 голосов
/ 13 октября 2011

Похоже, ваш settings.COMPRESS_URL должен получить статический от вашей системы, а не от самого URL.

Попробуйте изменить в настройках значение 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__))

Пожалуйста, обновите журнал ошибок, добавив новую информацию или мои комментарии.

...