2011-10-08 22 views
27

django-compressordjango-staticfilesを設定して、圧縮されたCSS/Javascriptと画像がAmazonのS3から提供されるようにしようとしています。AmazonのS3でdjango-compressorとdjango-staticfilesを設定する方法は?

S3をバックエンドとして使用して、collectstaticコマンドがSTATIC_ROOTの代わりにS3にファイルを送信するように静的ファイルを設定できました。

しかし、django-compressorをミックスに追加しようとすると、それはすべて私のために崩壊するようです。 documentationリモートストレージの設定に続いて、ストレージバックエンドのサブクラスbotoを作成したので、exampleを​​にコピーしました。このキャッシュバックエンドを使用すると、ファイルはS3ではなくstatic_mediaにコピーされます。最初のページが読み込まれると、CACHEフォルダーがS3とstatic_mediaフォルダーに表示されます。

STATICFILES_STORAGECOMPRESS_STORAGEをbotoの通常のS3クラス(storages.backends.s3boto.S3BotoStorage)に戻すと、静的資産はS3バケットに収集され、static_mediaフォルダには収集されません。原点としてタグとして{% compress css %}compressor/base.pyを強調

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

:しかし、ページを再ロードしようとすると、エラーがスローされます。

settings.pyのS3/staticfiles /コンプレッサ部:

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-compressorの問題によると、問題は、collectstaticプロセス(shutil.copy2を使用)中にdjango-staticfilesが保存する方法にあります。この問題は、django-staticfilesの新しいバージョンで修正されました。これは、Django 1.3に付属しているものの代わりに使用できます。

pip install django-staticfiles==dev 

そして、あなたのsettings.pyで、更新されたバージョンに切り替える:ジャンゴ・コンプレッサーと収集staticfilesファイルからキャッシュディレクトリの両方がS3上に表示する必要があり、再びpython manage.py collectstaticを実行した後

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', 
    #... 
) 

0

使用するとdjango_compressor==1.2が私のために働いた。なぜあなたはdjango-staticfilesをインストールする必要があるのか​​分かりませんが、1.232以外のすべてのバージョンはdjango_compressorです。

0

多忙な仕事と研究の末、私はついにこれを行うことができました。そして、私はdetailed guideと書いて、gzipで圧縮して提供する方法も含めて書きました。あなたのS3は、米国の外にある場合

  1. 使用AWS_IS_GZIPPED = True
  2. 基本的には、いくつかのことを行う必要があります。 S3Connectionクラスを作成して、S3 URLの変数DefaultHostを上書きする必要があります。例s3-eu-west-1.amazonaws.com

  3. ドットバケット名を使用している場合は、例:subdomain.domain.tld

    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を設定するカスタムクラスであること:あなたがこれはあなたが必要CachedS3BotoStorageクラスであるあなたのCachedS3BotoStorage

non_gzipped_file_content = content.fileを設定する必要がAWS_S3_CALLING_FORMAT = 'boto.s3.connection.OrdinaryCallingFormat'

  • を設定する必要がありますS3の位置。完全なカスタムストレージとsettings.pyの詳細な詳細ガイドを確認してください

  • 0

    Amazon S3で多くの(複数の)マニフェスト_%。jsonを作成する問題を修正するために、上記の解決策をいくつかの行で完成させてください。 https://stackoverflow.com/a/31545361/1359475

    関連する問題