2013-03-02 16 views
9

Jak można użyć django_compressor do wysyłania plików gziped do Amazon S3?Czy można użyć django_compressor/S3/gzip?

Próbowałem na kilka sposobów, ale to nie zadziałało. Oto moja ostatnia konfiguracja 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' 

i mój 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

pracuję w tej samej sprawie, tylko złożony problem na django_compressor's GitHub: https://github.com/jezdez/django_compressor/issues/368 – kevinharvey

+0

Powodzenia @kcharvey! Czekam na następną wersję :-D – Thomas

+0

Czy ktoś to sortuje? Próbuję też to usprawnić. – Murph

Odpowiedz

7

django-storages S3 przechowywania backend supports gzip. Dodaj do settings.py:

AWS_IS_GZIPPED = True 
+0

Uwaga dla użytkowników w chmurze: to nie wystarczy, aby Cloudfront wyświetlał spakowane pliki gzip –

5

Po dużą ilością dni ciężkiej pracy i badań byłem w końcu w stanie to zrobić i postanowiłem napisać detailed guide temat.

Zasadniczo trzeba zrobić kilka rzeczy:

  1. Użyj AWS_IS_GZIPPED = True
  2. Jeśli S3 jest poza USA. Musisz utworzyć niestandardową klasę S3Connection, w której zastąpisz zmienną DefaultHost w swoim adresie URL S3. Przykład s3-eu-west-1.amazonaws.com
  3. Jeśli używasz kropkowanej nazwy pojemnika, przykład subdomain.domain.tld. Trzeba ustawić AWS_S3_CALLING_FORMAT = 'boto.s3.connection.OrdinaryCallingFormat'
  4. Musisz ustawić non_gzipped_file_content = content.file w CachedS3BotoStorage

Jest to klasa CachedS3BotoStorage trzeba:

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

To jest odpowiednia odpowiedź. Zobacz także https://github.com/django-compressor/django-compressor/issues/404#issuecomment-18787650 – chhantyal

Powiązane problemy