【问题标题】:django-pipeline with s3 storage is not compressing my js带有 s3 存储的 django-pipeline 没有压缩我的 js
【发布时间】:2015-10-19 04:22:27
【问题描述】:

我将 django-pipeline 与 s3 一起使用。我成功地使用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 = True 因为DEBUG = True 而我在本地运行。
  6. PIPELINE_JS_COMPRESSOR = 'pipeline.compressors.yuglify.YuglifyCompressor' 尽管这应该是默认设置。
  7. 使用 npm -g install yuglify 安装了 Yuglify 压缩机。
  8. PIPELINE_YUGLIFY_BINARY = '/usr/local/bin/yuglify' 即使默认 env 应该可以工作。
  9. 使用{% load pipeline %}{% javascript 'scripts' %} 可以工作。

更多细节:

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。

类似问题:

【问题讨论】:

  • 您尝试过gzip 压缩吗,我们遇到了类似的错误,请在github.com/cyberdelia/django-pipeline/issues/312 进行全面讨论
  • 我发现 Pipeline 与 django 压缩器相比很难设置。如果您没有使用 gulp 或 grunt 之类的任务管理器,我建议您尝试一下。
  • @Shaikhul 谢谢你,我实际上已经找到了 312 并试图破译。您能否提供一个示例“您需要更改静态文件存储 url 方法以返回 .gz url(以及静态文件/管道模板标签,具体取决于您是否关心不支持 gzip 的客户端)。github.com/cyberdelia/django-pipeline/issues/… 也不要忘记在 s3 上设置正确的标头以将这些资产作为 gzip 压缩。"

标签: python django django-pipeline


【解决方案1】:

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

from pipeline.storage import GZIPMixin

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

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

为了解决这个问题作者says

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

我改编了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,它执行 gzip 并设置适当的标头。

但是,如果要支持没有 gzip 的客户端,则需要更多。

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

【讨论】:

    猜你喜欢
    • 2012-06-11
    • 1970-01-01
    • 2012-04-29
    • 1970-01-01
    • 2016-05-26
    • 2023-03-29
    • 1970-01-01
    • 2021-02-20
    • 1970-01-01
    相关资源
    最近更新 更多