Ответ 1
Я столкнулся с той же проблемой.
Ответ был найден здесь: https://github.com/jezdez/django_compressor/pull/206 Решение link делает handler500. Я решил изменить шаблон 500.html, чтобы избежать {{STATIC_URL}} в нем, и проблема была решена.
Я использую 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')
Я столкнулся с той же проблемой.
Ответ был найден здесь: https://github.com/jezdez/django_compressor/pull/206 Решение link делает handler500. Я решил изменить шаблон 500.html, чтобы избежать {{STATIC_URL}} в нем, и проблема была решена.
Похоже, что STATIC_URL не в вашем контексте. У вас есть сконфигурированный контекстный процессор staticfiles? Вы пытались понравиться файл без тегов компрессора? {{STATIC_URL}} правильно отображается на странице при загрузке?
Я думаю, что компрессор проверяет URL-адрес, даже если он обращается к нему через файловую систему, глядя на https://github.com/jezdez/django_compressor/blob/develop/compressor/base.py#L57
Это старый вопрос, но один из немногих результатов поиска при поиске этого сообщения об ошибке, поэтому может быть полезно поделиться своим решением.
В моем случае это был мертвый простой случай: я жестко закодировал свой статический 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" />
Надеюсь, это поможет кому угодно.
Я смотрю на него еще немного, и я уверен, что это исключение вызвано попыткой отобразить страницу с необработанной ошибкой без полного контекста, который имел первый проход. Это вызывает исключение в django-компрессоре. [1]
Решение, конечно, должно обрабатывать все ошибки.
[1] Я также запускаю нестандартный код для отображения статических страниц, возможно, это мешает и причина, по которой ошибка не слишком распространена.
Я столкнулся с той же проблемой; в моем случае проблема была вызвана использованием COMPRESS_OFFLINE_CONTEXT
- который не соответствует .update()
контексту, а заменяет его вообще, удаляя STATIC_URL
.
Решение в моем случае просто добавило его обратно в COMPRESS_OFFLINE_CONTEXT
после импорта local_settings, иначе любое переопределение там не сработало бы.
Кажется, ваш 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__))
Обновите свой журнал ошибок с помощью новой информации или комментариев.