2011-10-08 70 views
27

我試圖設置django-compressordjango-staticfiles,以便壓縮的CSS/Javascript和圖像從亞馬遜的S3提供。如何用Amazon S3配置django-compressor和django-staticfiles?

我設法使用S3作爲後端安裝靜態文件,所以它的collectstatic命令將文件發送到S3而不是STATIC_ROOT

然而,當試圖將django-compressor添加到混音中的時候,它似乎對我來說都是破碎的。繼documentation設置遠程存儲後,我創建了存儲後端的子類boto,因此我將example複製到​​。一旦我開始使用這個緩存的後端,文件被複制到static_media而不是S3。第一頁加載後,CACHE文件夾出現在S3和static_media文件夾中。

設置STATICFILES_STORAGECOMPRESS_STORAGE回到博託正常S3級(storages.backends.s3boto.S3BotoStorage)導致靜態資產被收集到S3存儲和無static_media文件夾。然而在重新加載頁面引發錯誤:

Caught NotImplementedError while rendering: This backend doesn't support absolute paths. 

突出{% compress css %}爲標籤和compressor/base.py爲原點。

的S3/staticfiles /壓縮機我settings.py的部分:

DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3BotoStorage' 
AWS_ACCESS_KEY_ID = 'key' 
AWS_SECRET_ACCESS_KEY ='secret' 
AWS_STORAGE_BUCKET_NAME = 'my-bucket' 
S3_URL = 'http://my-bucket.s3.amazonaws.com/' 

MEDIA_ROOT = 'client_media' 
MEDIA_URL = '/media/' 
STATIC_ROOT = 'static_media' 
STATIC_URL = S3_URL 
ADMIN_MEDIA_PREFIX = S3_URL + 'admin/' 
STATICFILES_DIRS = (
    join(DIRNAME, 'static'), 
) 
STATICFILES_FINDERS = (
    'django.contrib.staticfiles.finders.FileSystemFinder', 
    'django.contrib.staticfiles.finders.AppDirectoriesFinder', 
    'compressor.finders.CompressorFinder', 
) 

COMPRESS_ENABLED = True 
COMPRESS_URL = S3_URL 
COMPRESS_ROOT = STATIC_ROOT 
COMPRESS_STORAGE = 'storage.CachedS3BotoStorage' 
STATICFILES_STORAGE = COMPRESS_STORAGE 

所以,我該怎麼錯在何處?我可以在使用CachedS3BotoStorage自定義存儲時錯誤配置某些內容嗎?

回答

9

您的設置看起來正確。您應該將STATICFILES_STORAGECOMPRESS_STORAGE都設置爲storage.CachedS3BotoStorage,但不能切換回storages.backends.s3boto.S3BotoStorage

根據this django壓縮機問題,問題是與django-staticfiles在collectstatic過程中保存的方式(使用shutil.copy2)。此問題已在更新版本的django-staticfiles中得到糾正,該版本可用於替代Django 1.3附帶的版本。

pip install django-staticfiles==dev 

而在你settings.py,切換到更新的版本:

STATICFILES_FINDERS = (
    #"django.contrib.staticfiles.finders.FileSystemFinder", 
    #"django.contrib.staticfiles.finders.AppDirectoriesFinder", 
    "staticfiles.finders.FileSystemFinder", 
    "staticfiles.finders.AppDirectoriesFinder", 
    "compressor.finders.CompressorFinder", 
) 

INSTALLED_APPS = (
    'django.contrib.auth', 
    'django.contrib.contenttypes', 
    'django.contrib.sessions', 
    #'django.contrib.staticfiles', 
    'staticfiles', 
    #... 
) 

再次運行python manage.py collectstatic後,無論是從Django的壓縮機緩存目錄和收集staticfiles文件應該出現在S3。

0

使用django_compressor==1.2爲我工作。我不知道你爲什麼需要安裝django-staticfiles,但是除1.2以外的所有django_compressor版本都有這個問題。

0

經過大量艱苦的工作和研究,我終於可以做到這一點,並決定寫一個關於它的detailed guide,包括如何爲它們提供壓縮的gzip。

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

  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 

注意EUConnection是一個自定義類,我設置DefaultHost我S3位置。檢查完整的定製儲存在更長的時間,詳細的指南和settings.py中