2013-03-02 2 views
9

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

Я пробовал несколько способов, но это не сработало. Вот моя последняя конфигурация 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 
+0

Я работаю по тому же вопросу, просто представил вопрос о django_compressor's GitHub: https://github.com/jezdez/django_compressor/issues/368 – kevinharvey

+0

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

+0

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

ответ

7

django-storages S3 хранения бэкенд supports gzip. Добавить в settings.py:

AWS_IS_GZIPPED = True 
+0

примечание для пользователей облачного режима: этого недостаточно, чтобы получить облачные сервисы gzipped –

5

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

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

  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 
+1

Это правильный ответ. См. Также https://github.com/django-compressor/django-compressor/issues/404#issuecomment-18787650 – chhantyal

Смежные вопросы