Django Sass 压缩器 django_libsass.SassCompiler: 找不到命令
我在使用Django-Compressor这个工具,它是Wagtail的一部分(Wagtail是一个基于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
在skeleton.html的第20行是:
<!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和compressor,还尝试过用pip install libsass
、ngm install lessc
、pip install sass
,把DEBUG = False
改了,添加了COMPRESSOR_OFFLINE
和COMPRESSOR_ENABLED
,这些都是其他类似问题的建议。运行manage.py compress
时也返回了同样的错误。
我已经检查过,site-packages和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的问题后,尝试了pip install compass
,但没有效果。
尝试和错误 #4
根据gasman的评论,我运行了python manage.py shell并尝试导入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'
5 个回答
你可以通过运行 pip install django_pyscss
这个命令来解决你的问题。
pip install django_compressor==2.4
pip install django-libsass
这个方法对我有效。另外,记得安装最新版本的django-libsass。
这个错误
/bin/sh: django_libsass.SassCompiler: command not found
表示 Django Compressor 正在尝试把 django_libsass.SassCompiler
当作一个命令来运行,但这个脚本无法执行。
原因是 django_libsass.SassCompiler
不是一个可以在命令行中运行的有效程序。
你最好先安装 sass,如果还没有安装的话,可以按照这个页面上的说明进行安装:http://sass-lang.com/install
然后把你的代码改成:
COMPRESS_PRECOMPILERS = (
('text/x-scss', 'sass --scss {infile} {outfile}'),
)
你需要确保 sass
命令在你的路径中。
根据文档(http://django-compressor.readthedocs.org/en/latest/settings/#django.conf.settings.COMPRESS_PRECOMPILERS),你元组的第二部分是:
用于调用每个文件的命令。现代 Python 字符串格式化会为两个占位符 {infile} 和 {outfile} 提供支持,这两个占位符在命令字符串中存在时,会触发这些临时文件的实际创建。如果在命令字符串中没有给出,Django Compressor 将分别使用标准输入和标准输出。
我在我的Python-Django项目中也遇到了同样的问题,还有rvm。问题在于压缩预编译器不知道该用哪个rvm。解决办法是把ruby的路径添加到环境变量中,并在settings.py文件里告诉预编译器去哪里找sass:
就像我这种情况(只需运行 which sass
来找到路径):
environ['PATH'] = '/Users/username/.rvm/gems/ruby-2.1.5/bin:/Users/username/.rvm/gems/ruby-2.1.5@global/bin:/Users/username/.rvm/rubies/ruby-2.1.5/bin:Users/username/bin'
COMPRESS_PRECOMPILERS = (
('text/x-scss', '/Users/username/.rvm/gems/ruby-2.1.5/bin/sass --scss --trace {infile} {outfile}'),
)
希望这能帮助到某些人。
(根据要求,把我的评论重新发成答案…)
最初的错误信息:django_libsass.SassCompiler: command not found
这意味着系统无法找到并导入django-libsass这个库。(django-compressor在遇到这个问题时,试图把它当作一个命令来执行,但django_libsass并不是一个可以直接运行的命令,所以也失败了,最终显示了这里的实际错误。)解决办法是确保已经安装了django-libsass - 你可以通过运行pip freeze
来查看它是否在列表中。
第二个错误:'module' object has no attribute 'compile'
这表示系统中安装了另一个包,它定义了一个叫sass
的模块,而这个模块被加载了,取代了我们想要的来自libsass包的模块。解决办法是卸载所有与sass相关的包,只保留django-libsass和libsass。