29

我正在尝试设置django-compressordjango-staticfiles,以便从 Amazon 的 S3 提供压缩的 CSS/Javascript 和图像。

我已经设法使用 S3 作为后端来设置静态文件,因此它的collectstatic命令将文件发送到 S3 而不是STATIC_ROOT.

然而,当试图添加django-compressor到混合中时,这对我来说似乎一切都崩溃了。按照有关设置远程存储的文档,我创建了存储后端的子类boto ,因此我将示例复制到storage.py. 一旦我开始使用这个缓存的后端,文件就会被复制到 static_media 而不是 S3。在第一页加载后,CACHE 文件夹出现在 S3 和 static_media 文件夹中。

设置STATICFILES_STORAGECOMPRESS_STORAGE返回到 boto 的普通 S3 类 ( storages.backends.s3boto.S3BotoStorage) 会导致静态资产被收集到 S3 存储桶中,并且没有 static_media 文件夹。但是尝试重新加载页面会引发错误:

Caught NotImplementedError while rendering: This backend doesn't support absolute paths.

突出显示{% compress css %}为标签和compressor/base.py原点。

我的 s3/staticfiles/compressor 部分settings.py

DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3BotoStorage'
AWS_ACCESS_KEY_ID = 'key'
AWS_SECRET_ACCESS_KEY ='secret'
AWS_STORAGE_BUCKET_NAME = 'my-bucket'
S3_URL = 'http://my-bucket.s3.amazonaws.com/'

MEDIA_ROOT = 'client_media'
MEDIA_URL = '/media/'
STATIC_ROOT = 'static_media'
STATIC_URL = S3_URL
ADMIN_MEDIA_PREFIX = S3_URL + 'admin/'
STATICFILES_DIRS = (
    join(DIRNAME, 'static'),
)
STATICFILES_FINDERS = (
    'django.contrib.staticfiles.finders.FileSystemFinder',
    'django.contrib.staticfiles.finders.AppDirectoriesFinder',
    'compressor.finders.CompressorFinder',
)

COMPRESS_ENABLED = True
COMPRESS_URL = S3_URL
COMPRESS_ROOT = STATIC_ROOT
COMPRESS_STORAGE = 'storage.CachedS3BotoStorage'
STATICFILES_STORAGE = COMPRESS_STORAGE

那么我哪里错了?CachedS3BotoStorage使用自定义存储时我是否配置错误?

4

4 回答 4

10

您的设置看起来正确。您应该同时保留STATICFILES_STORAGECOMPRESS_STORAGE设置为storage.CachedS3BotoStorage虽然而不是切换回storages.backends.s3boto.S3BotoStorage.

根据这个django-compressor 问题,问题在于 django-staticfiles 在 collectstatic 过程中保存的方式(使用shutil.copy2)。此问题已在较新版本的django-staticfiles中得到纠正,该版本可用于替代 Django 1.3 附带的版本。

pip install django-staticfiles==dev

在您的 中settings.py,切换到更新版本:

STATICFILES_FINDERS = (
    #"django.contrib.staticfiles.finders.FileSystemFinder",
    #"django.contrib.staticfiles.finders.AppDirectoriesFinder",
    "staticfiles.finders.FileSystemFinder",
    "staticfiles.finders.AppDirectoriesFinder",
    "compressor.finders.CompressorFinder",
)

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    #'django.contrib.staticfiles',
    'staticfiles',
    #...
)

再次运行python manage.py collectstatic后,来自 django-compressor 的 CACHE 目录和收集的静态文件文件都应该显示在 S3 上。

于 2011-10-11T01:17:57.977 回答
0

使用django_compressor==1.2对我有用。我不确定你为什么需要安装 django-staticfiles 但是django_compressor除了 1.2 之外的所有版本都有这个问题。

于 2013-08-09T09:29:18.550 回答
0

经过几天的努力和研究,我终于能够做到这一点,我决定写一个详细的指南,包括如何用 gzip 压缩它们。

基本上你需要做几件事:

  1. 采用AWS_IS_GZIPPED = True
  2. 如果您的 S3 在美国境外。您需要创建一个自定义S3Connection类,在其中将DefaultHost变量覆盖到您的 S3 url。例子s3-eu-west-1.amazonaws.com
  3. 如果您使用虚线存储桶名称,例如subdomain.domain.tld. 你需要设置AWS_S3_CALLING_FORMAT = 'boto.s3.connection.OrdinaryCallingFormat'
  4. 你必须non_gzipped_file_content = content.file在你的CachedS3BotoStorage

这是CachedS3BotoStorage您需要的课程:

class CachedS3BotoStorage(S3BotoStorage):
    """
    S3 storage backend that saves the files locally, too.
    """
    connection_class = EUConnection
    location = settings.STATICFILES_LOCATION
    def __init__(self, *args, **kwargs):
        super(CachedS3BotoStorage, self).__init__(*args, **kwargs)
        self.local_storage = get_storage_class(
            "compressor.storage.CompressorFileStorage")()

def save(self, name, content):
    non_gzipped_file_content = content.file
    name = super(CachedS3BotoStorage, self).save(name, content)
    content.file = non_gzipped_file_content
    self.local_storage._save(name, content)
    return name

请注意,这EUConnection是我设置DefaultHost为我的 S3 位置的自定义类。查看更长更详细的指南以获取完整的自定义存储和设置.py

于 2015-05-06T17:36:23.307 回答
0

试试这篇用几行完成上述解决方案的帖子,以解决在 Amazon S3 中创建许多(多个)manifest_%.json 的问题。 https://stackoverflow.com/a/31545361/1359475

于 2015-07-21T17:09:15.157 回答