带有s3存储的django-pipeline没有压缩我的js

时间:2015-07-28 14:26:49

标签: python django django-pipeline

我正在使用带有s3的django-pipeline。我成功地使用collectstatic来组合我的Javascript文件并将它们存储在我的s3存储桶中,但是由于某种原因它们没有被压缩(通过查看文件,它的大小和内容编码来验证)。否则,使用合并后的scripts.js工作正常。

以下是我使用django-pipeline所做的更改:

  1. 为已安装的应用添加了pipeline
  2. 'pipeline.finders.PipelineFinder'添加到STATICFILES_FINDERS
  3. 设置STATICFILES_STORAGE = 'mysite.custom_storages.S3PipelineManifestStorage'此类如文档中所定义,如下所示。
  4. 设置PIPELINE_JS,如下所示,它可以正常工作,但不会被压缩。
  5. PIPELINE_ENABLED = TrueDEBUG = True以来我在本地运行。
  6. PIPELINE_JS_COMPRESSOR = 'pipeline.compressors.yuglify.YuglifyCompressor'即使这应该是默认的。
  7. 使用npm -g install yuglify安装Yuglify Compressor。
  8. PIPELINE_YUGLIFY_BINARY = '/usr/local/bin/yuglify'即使env的默认设置有效。
  9. 使用有效的{% load pipeline %}{% javascript 'scripts' %}
  10. 更多细节:

    PIPELINE_JS = {
        'scripts': {
            'source_filenames': (
                'lib/jquery-1.11.1.min.js',
                ...            
            ),
            'output_filename': 'lib/scripts.js',
        }
    }
    
    class S3PipelineManifestStorage(PipelineMixin, ManifestFilesMixin, S3BotoStorage):
        location = settings.STATICFILES_LOCATION
    

    如上所述,collectstatic确实生成了scripts.js而未压缩。该命令的输出包括:

    Post-processed 'lib/scripts.js' as 'lib/scripts.js'
    

    我正在使用Django 1.8,django-pipeline 1.5.2和django-storages 1.1.8。

    类似的问题:

1 个答案:

答案 0 :(得分:1)

缺少的步骤是扩展GZipMixin,并且,它必须是父母列表中的第一个:

from pipeline.storage import GZIPMixin

class S3PipelineManifestStorage(GZIPMixin, PipelineMixin, ManifestFilesMixin, S3BotoStorage):
    location = settings.STATICFILES_LOCATION

现在collectstatic也会生成每个文件的.gz版本,但我的模板仍然没有引用.gz版本。

为了解决这个问题,作者says

  

要使其与S3一起使用,您需要更改静态文件   存储url方法返回.gz urls(和staticfiles / pipeline   模板标签取决于您是否关心不支持的客户   gzip的)。另外不要忘记在s3上设置正确的标题来提供服务   这些资产被压缩了。

我改编了an example他提供的elsewhere,它覆盖了url方法:

class S3PipelineManifestStorage(GZIPMixin, PipelineMixin, ManifestFilesMixin, S3BotoStorage):
    location = settings.STATICFILES_LOCATION

    def url(self, name, force=False):
        # Add *.css if you are compressing those as well.
        gzip_patterns = ("*.js",)
        url = super(GZIPMixin, self).url(name, force)
        if matches_patterns(name, gzip_patterns):
            return "{0}.gz".format(url)
        return url

这仍然无法设置Content-Encoding标题。

更简单的替代方法是使用S3Boto Storages选项AWS_IS_GZIPPED执行gzipping并设置相应的标头。

然而,需要更多支持没有gzip的客户端。

亚马逊在serving compressed files from S3上的这些说明也很有用。