2013-03-02 6 views
9

Come è possibile utilizzare django_compressor per inviare file gzip su Amazon S3?È possibile utilizzare django_compressor/S3/gzip?

Ho provato in diversi modi ma non ha funzionato. Qui è la mia ultima configurazione 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' 

e la mia 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

sto lavorando sullo stesso tema, appena presentato un problema su django_compressor's GitHub: https://github.com/jezdez/django_compressor/issues/368 – kevinharvey

+0

Buona fortuna @kcharvey! Non vedo l'ora che arrivi la prossima versione :-D – Thomas

+0

Qualcuno lo ordina? Sto cercando di far funzionare anche questo. – Murph

risposta

7

django-storages S3 storage back-end supports gzip. Aggiungere al settings.py:

AWS_IS_GZIPPED = True 
+0

nota per gli utenti di cloudfront: questo non è sufficiente per ottenere Cloudfront che serve risorse gzipped –

5

Dopo un sacco di giorni di duro lavoro e di ricerca sono stato finalmente in grado di fare questo e ho deciso di scrivere un detailed guide su di esso.

Fondamentalmente è necessario fare un paio di cose:

  1. Usa AWS_IS_GZIPPED = True
  2. Se il vostro S3 è al di fuori degli Stati Uniti. È necessario creare una classe personalizzata S3Connection in cui si esegue l'override della variabile DefaultHost nell'URL S3. Esempio s3-eu-west-1.amazonaws.com
  3. Se si sta utilizzando un nome bucket punteggiato, esempio subdomain.domain.tld. È necessario impostare AWS_S3_CALLING_FORMAT = 'boto.s3.connection.OrdinaryCallingFormat'
  4. È necessario impostare non_gzipped_file_content = content.file nella vostra CachedS3BotoStorage

Questa è la classe CachedS3BotoStorage è necessario:

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

Questa è la risposta giusta. Vedi anche https://github.com/django-compressor/django-compressor/issues/404#issuecomment-18787650 – chhantyal