Возможно ли использовать django_compressor /S3 / gzip?

#python #django #amazon-s3 #gzip

#django #django-компрессор

Вопрос:

Как можно использовать django_compressor для отправки файлов gziped на Amazon S3?

Я пробовал несколькими способами, но это не сработало. Вот мой последний settings.py конфигурация:

 COMPRESS_ENABLED = True
COMPRESS_OFFLINE = True

COMPRESS_ROOT = STATIC_ROOT
COMPRESS_URL = "http://xxx.cloudfront.net/"
STATIC_URL = COMPRESS_URL
COMPRESS_OUTPUT_DIR = 'CACHE'

#COMPRESS_STORAGE = 'storages.backends.s3boto.S3BotoStorage'
COMPRESS_STORAGE = 'core.storage.CachedS3BotoStorage'

STATICFILES_STORAGE = 'compressor.storage.GzipCompressorFileStorage'
COMPRESS_YUI_BINARY = 'java -jar contrib/yuicompressor-2.4.7/build/yuicompressor-2.4.7.jar'
COMPRESS_YUI_JS_ARGUMENTS = ''
COMPRESS_CSS_FILTERS = ['compressor.filters.yui.YUICSSFilter']
COMPRESS_JS_FILTERS = ['compressor.filters.yui.YUIJSFilter']
COMPRESS_CSS_HASHING_METHOD = 'hash'
 

и мой storage.py

 from django.core.files.storage import get_storage_class
from storages.backends.s3boto import S3BotoStorage

class CachedS3BotoStorage(S3BotoStorage):
    """
    S3 storage backend that saves the files locally, too.
    """
    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):
        name = super(CachedS3BotoStorage, self).save(name, content)
        self.local_storage._save(name, content)
        return name
 

Комментарии:

1. Я работаю над той же проблемой, только что отправил проблему на GitHub django_compressor: github.com/jezdez/django_compressor/issues/368

2. Удачи @kcharvey! Я с нетерпением жду следующей версии: -D

3. Кто-нибудь сортирует это? Я тоже пытаюсь заставить это работать.

Ответ №1:

серверная часть хранилища django-storages S3 поддерживает gzip. Добавить в settings.py:

 AWS_IS_GZIPPED = True
 

Комментарии:

1. примечание для пользователей cloudfront: этого недостаточно, чтобы Cloudfront обслуживал архивированные ресурсы

Ответ №2:

После множества дней напряженной работы и исследований я, наконец, смог это сделать.

В основном вам нужно сделать несколько вещей:

  1. Использовать AWS_IS_GZIPPED = True
  2. Если ваш S3 находится за пределами НАС. Вам нужно создать пользовательский S3Connection класс, в котором вы переопределяете DefaultHost переменную для своего URL-адреса S3. Пример 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
 

Комментарии:

1. Это правильный ответ. Смотрите также github.com/django-compressor/django-compressor/issues /…

Ответ №3:

Обновление 2019: это описано в официальной документации

 #mysite.py
from django.core.files.storage import get_storage_class
from storages.backends.s3boto import S3BotoStorage

class CachedS3BotoStorage(S3BotoStorage):
    """
    S3 storage backend that saves the files locally, too.
    """
    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):
        self.local_storage._save(name, content)
        super(CachedS3BotoStorage, self).save(name, self.local_storage._open(name))
        return name
 

И ваши настройки:

 #settings.py
INSTALLED_APPS  = ['compressor']

AWS_IS_GZIPPED = True

STATIC_ROOT = '/path/to/staticfiles' #if not set, set this to an empty folder
COMPRESS_ROOT = STATIC_ROOT
STATICFILES_STORAGE = 'mysite.storage.CachedS3BotoStorage'
COMPRESS_STORAGE = STATICFILES_STORAGE
STATIC_URL = 'https://compressor-test.s3.amazonaws.com/'
COMPRESS_URL = STATIC_URL
 

Чем вы можете просто запустить:

 python manage.py collectstatic