2013-03-02 73 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的GitHub:https://github.com/jezdez/django_compressor/issues/368 – kevinharvey 2013-03-05 15:42:10

+0

祝你好运@kcharvey!我期待着下一个版本:-D – Thomas 2013-03-06 04:01:28

+0

任何人排序?我试图让这个工作。 – Murph 2013-05-22 22:10:16

回答

7

django-storages S3存储后端supports gzip。加入settings.py:

AWS_IS_GZIPPED = True 
+0

cloudfront用户注意事项:这不足以让Cloudfront提供gzip资产服务 – 2014-11-16 10:38:12

5

大量的艰苦工作和研究几天后我终于能够做到这一点,我决定写一个detailed guide了。

基本上你需要做的几件事情:

  1. 使用AWS_IS_GZIPPED = True
  2. 如果你的S3是美国以外。您需要创建在您覆盖DefaultHost变量设置为S3网址的自定义S3Connection类。例如s3-eu-west-1.amazonaws.com
  3. 如果您使用的是点斗名,例如subdomain.domain.tld。您需要设置AWS_S3_CALLING_FORMAT = 'boto.s3.connection.OrdinaryCallingFormat'
  4. 你必须设置non_gzipped_file_content = content.fileCachedS3BotoStorage

这是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 2015-07-01 19:11:16