Я использую фильтр Django-Compressor как часть Wagtail (вариант CMS Django с очень крутым пользовательским интерфейсом). Среда: Wagtail 0.2 + Python 2.7 + Django 1.6 + Virtualenv + FastCGI + виртуальный хостинг Apache.
Проблема возникает при попытке доступа к странице администратора/логина CMS. Django показывает шаблон рендеринга ошибок
Error during template rendering
In template /home/username/env/lib/python2.7/site-packages/wagtail/wagtailadmin/templates/wagtailadmin/skeleton.html, error at line 20
/bin/sh: django_libsass.SassCompiler: command not found
Строка 20 скелета.html:
<!doctype html>
{% load compress %}
<!--[if lt IE 7]> <html class="no-js lt-ie9 lt-ie8 lt-ie7" lang="{{ LANGUAGE_CODE|default:"en-gb" }}"> <![endif]-->
<!--[if IE 7]> <html class="no-js lt-ie9 lt-ie8" lang="{{ LANGUAGE_CODE|default:"en-gb" }}"> <![endif]-->
<!--[if IE 8]> <html class="no-js lt-ie9" lang="{{ LANGUAGE_CODE|default:"en-gb" }}"> <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="{{ LANGUAGE_CODE|default:"en-gb" }}"> <!--<![endif]-->
<title>Wagtail - {% block titletag %}{% endblock %}</title>
<meta name="description" content="" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<script src="//cdnjs.cloudflare.com/ajax/libs/modernizr/2.6.2/modernizr.min.js"></script>
{% block css %}{# Block defined for timing breakdowns in django debug toolbar - not expected to be overridden #}
<link rel="stylesheet" href="//fonts.googleapis.com/css?family=Open+Sans:300,400,600,700" />
<link rel="stylesheet" href="//fonts.googleapis.com/css?family=Bitter:400,700" />
19
20 {% compress css %}
21 <link rel="stylesheet" href="{{ STATIC_URL }}wagtailadmin/scss/normalize.css" />
<link rel="stylesheet" href="{{ STATIC_URL }}wagtailadmin/scss/vendor/jquery-ui/jquery-ui-1.10.3.verdant.css" />
<link rel="stylesheet" href="{{ STATIC_URL }}wagtailadmin/scss/vendor/jquery.timepicker.css" />
<link rel="stylesheet" href="{{ STATIC_URL }}wagtailadmin/scss/core.scss" type="text/x-scss" />
{% endcompress %}
{% block extra_css %}{% endblock %}
{% endblock %}
</head>
<body class="{% block bodyclass %}{% endblock %} {% if messages %}has-messages{% endif %}">
прекомпилятор в моем settings.py, DEBUG имеет значение True:
COMPRESS_ENABLED = True
COMPRESS_PRECOMPILERS = (
('text/x-scss', 'django_libsass.SassCompiler'),
)
ПРОБЫ И ОШИБКИ №1
Я пытался изменить на:
('text/x-scss', '/home/username/env/lib/python2.7/site-packages/django_libsass {infile} {outfile}')
но это приводит меня к ошибке элемента последовательности обновления словаря № 0.
У меня установлены django_libsass и компрессор, также пробовал pip install libsass
, ngm install lessc
, pip install sass
, переворачивая DEBUG = False
, добавляя COMPRESSOR_OFFLINE
, добавляя COMPRESSOR_ENABLED
, как предлагалось в других подобных вопросах. Выполнение manage.py compress
возвращает ту же ошибку.
Перепроверил, и сайт-пакеты и django_libsass действительно находятся на моем sys.path
SassCompiler можно найти в ~/env/lib/python2.7/site-packages/django_libsass.py
ПРОБЫ И ОШИБКИ №2
Перепроверил, что sass
установлен и на моем пути.
Измените код на:
COMPRESS_PRECOMPILERS = (
('text/x-scss', 'sass --scss {infile} {outfile}'),
)
Возвращает ошибку:
Exception Type: FilterError
Exception Value:
/bin/sh: sass: command not found
ПРОБЫ И ОШИБКИ №3
После прочтения этого feedly issue попробовал pip install compass
безрезультатно.
ПРОБЫ И ОШИБКИ №4
После комментария газовщика я запустил оболочку python manage.py и попытался импортировать SassCompiler. Он работает без ошибок.
Python 2.7.6 (default, Nov 11 2013, 18:34:29)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-3)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from django_libsass import SassCompiler
>>>
Полная обратная трассировка
Я прошу прощения, если этот вопрос становится слишком длинным.
Traceback:
File "/home/username/env/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
139. response = response.render()
File "/home/username/env/lib/python2.7/site-packages/django/template/response.py" in render
105. self.content = self.rendered_content
File "/home/username/env/lib/python2.7/site-packages/django/template/response.py" in rendered_content
82. content = template.render(context)
File "/home/username/env/lib/python2.7/site-packages/django/template/base.py" in render
140. return self._render(context)
File "/home/username/env/lib/python2.7/site-packages/django/template/base.py" in _render
134. return self.nodelist.render(context)
File "/home/username/env/lib/python2.7/site-packages/django/template/base.py" in render
840. bit = self.render_node(node, context)
File "/home/username/env/lib/python2.7/site-packages/django/template/debug.py" in render_node
78. return node.render(context)
File "/home/username/env/lib/python2.7/site-packages/django/template/loader_tags.py" in render
123. return compiled_parent._render(context)
File "/home/username/env/lib/python2.7/site-packages/django/template/base.py" in _render
134. return self.nodelist.render(context)
File "/home/username/env/lib/python2.7/site-packages/django/template/base.py" in render
840. bit = self.render_node(node, context)
File "/home/username/env/lib/python2.7/site-packages/django/template/debug.py" in render_node
78. return node.render(context)
File "/home/username/env/lib/python2.7/site-packages/django/template/loader_tags.py" in render
62. result = block.nodelist.render(context)
File "/home/username/env/lib/python2.7/site-packages/django/template/base.py" in render
840. bit = self.render_node(node, context)
File "/home/username/env/lib/python2.7/site-packages/django/template/debug.py" in render_node
78. return node.render(context)
File "/home/username/env/lib/python2.7/site-packages/compressor/templatetags/compress.py" in render
147. return self.render_compressed(context, self.kind, self.mode, forced=forced)
File "/home/username/env/lib/python2.7/site-packages/compressor/templatetags/compress.py" in render_compressed
107. rendered_output = self.render_output(compressor, mode, forced=forced)
File "/home/username/env/lib/python2.7/site-packages/compressor/templatetags/compress.py" in render_output
119. return compressor.output(mode, forced=forced)
File "/home/username/env/lib/python2.7/site-packages/compressor/css.py" in output
51. ret.append(subnode.output(*args, **kwargs))
File "/home/username/env/lib/python2.7/site-packages/compressor/css.py" in output
53. return super(CssCompressor, self).output(*args, **kwargs)
File "/home/username/env/lib/python2.7/site-packages/compressor/base.py" in output
246. content = self.filter_input(forced)
File "/home/username/env/lib/python2.7/site-packages/compressor/base.py" in filter_input
194. for hunk in self.hunks(forced):
File "/home/username/env/lib/python2.7/site-packages/compressor/base.py" in hunks
169. precompiled, value = self.precompile(value, **options)
File "/home/username/env/lib/python2.7/site-packages/compressor/base.py" in precompile
226. **kwargs)
File "/home/username/env/lib/python2.7/site-packages/django_libsass.py" in input
51. return compile(filename=self.filename)
File "/home/username/env/lib/python2.7/site-packages/django_libsass.py" in compile
41. return sass.compile(**kwargs)
Exception Type: AttributeError at /admin/login/
Exception Value: 'module' object has no attribute 'compile'
from django_libsass import SassCompiler
вmanage.py shell
? - person gasman   schedule 22.03.2014sass.compile
. Обеспокоился, что мой sass не был правильно установлен после ответа Кевина, и мой хостинг переустановил его, cython, libsass и компас. Также попробовалgem install sass
, который дает мне рубиновую папку с sass. До этого у меня был sass.so в папке с пакетами сайтов. - person moshushi   schedule 22.03.2014'module' object has no attribute 'compile'
отличается от той, о которой вы сообщали изначально, поэтому похоже, что что-то изменилось в вашей настройке: теперь она успешно находит django_libsass, но похоже, что она импортирует не то, что нужно для имени «sass». Попробуйте удалить все пакеты Python, связанные с sass, кроме libsass и django-libsass. Если это не имеет никакого значения, пожалуйста, запуститеimport sass; sass
внутриmanage.py shell
и дайте мне знать, что говорит вывод. - person gasman   schedule 23.03.2014import sass; sass
указывал наsass.pyc
, но все равно выдавал ту же ошибку атрибута. Удаление всех файлов.pyc
, связанных с sass, решило эту проблему, и я впервые вижу страницу входа! - person moshushi   schedule 23.03.2014/bin/sh: django_libsass.SassCompiler
, которую я получал. Я поставилshell = False
вbase.py
надежде Compressor Filter, что это не вызовет проблем в будущем - person moshushi   schedule 23.03.2014shell = False
не должно иметь значения... теперь, когда django-libsass правильно установлен, эта строка кода (надеюсь) никогда не запустится. - person gasman   schedule 24.03.2014