Django-Compressor: 在 DEBUG 模式下使用 lessc

5
我不确定我是否做对了一些事情,但这是问题所在:
  • 我正在使用带有lessc预处理器的django-compressor
  • 部分LESS文件具有相对图像URL。 有些是我的,有些是第三方库(例如Bootstrap)
  • COMPRESS_ENABLEDTrue时,一切正常工作
  • COMPRESS_ENABLEDFalse时,CssAbsoluteFilter不再运行,这意味着所有相对图像URL仍然保持相对,因此无法使用(因为它们不是从CACHE目录中的相对路径)

我可以想出一个“聪明”的目录结构,使得相对路径解析到来自CACHE目录或LESS文件目录的同一文件,但这似乎是一个脆弱的解决方法。

当涉及到LESS + django-compressor时,你通常如何工作?


对我来说,django_compressor似乎有一个bug - 预编译器总是被调用,但过滤器只在压缩时发生。 - Greg
是的,这正是发生的事情--所以不是一个错误,因为它按照文档操作。但是由于这不是所需的,在我看来,我想知道是否我漏掉了什么或者只是使用不当。 - Ludovic Chabant
似乎django_compressor的开发人员没有考虑到这种情况...如果不是一个bug,那肯定是个问题。你尝试过编写一个预编译脚本来转换你的URL吗? - Greg
在此问题上查看错误报告,请访问:https://github.com/jezdez/django_compressor/issues/226 - Jonatan Littke
3个回答

7
你可以使用一个简单的解决方案:
COMPRESS_PRECOMPILERS = (
    ('text/less', 'path.to.precompilers.LessFilter'),
)

precompilers.py:

from compressor.filters.base import CompilerFilter
from compressor.filters.css_default import CssAbsoluteFilter

class LessFilter(CompilerFilter):
    def __init__(self, content, attrs, **kwargs):
        super(LessFilter, self).__init__(content, command='lessc {infile} {outfile}', **kwargs)

    def input(self, **kwargs):
        content = super(LessFilter, self).input(**kwargs)
        return CssAbsoluteFilter(content).input(**kwargs)

请注意,这适用于 COMPRESS_ENABLED = TrueFalse

1
这个问题已经在django-compressor 1.6中得到解决。从changelog可以看到:
Apply CssAbsoluteFilter to precompiled css even when compression is disabled

即使 DEBUG = True,您的 less 文件仍会运行绝对过滤器。

0
如果你正在使用django-libsass,过滤器代码如下所示:
from compressor.filters.css_default import CssAbsoluteFilter
from django_libsass import SassCompiler


class PatchedSCSSCompiler(SassCompiler):
    def input(self, **kwargs):
        content = super(PatchedSCSSCompiler, self).input(**kwargs)
        return CssAbsoluteFilter(content).input(**kwargs)

然后在你的设置文件中:

COMPRESS_PRECOMPILERS = (
    ('text/x-scss', 'path.to.PatchedSCSSCompiler'),
)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接