29

圧縮された CSS/Javascript と画像が Amazon の S3 から提供されるように、 django -compressordjango-staticfilesをセットアップしようとしています。

S3 をバックエンドとして使用して staticfiles をセットアップすることができたので、collectstaticコマンドはファイルを の代わりに S3 に送信しますSTATIC_ROOT

しかしdjango-compressor、ミックスに追加しようとすると、すべてがバラバラになるように見えます。リモート ストレージの設定に関するドキュメントに従って、ストレージ バックエンドbotoのサブクラスを作成したので、をにコピーしましたstorage.py。このキャッシュされたバックエンドの使用を開始すると、ファイルは S3 ではなく static_media にコピーされます。最初のページの読み込み後、S3 と static_media フォルダーに CACHE フォルダーが表示されます。

設定STATICFILES_STORAGECOMPRESS_STORAGEて boto の通常の S3 クラスに戻す ( storages.backends.s3boto.S3BotoStorage) と、静的アセットが S3 バケットに収集され、static_media フォルダーは収集されません。ただし、ページをリロードしようとすると、次のエラーがスローされます。

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

{% compress css %}タグおよびcompressor/base.pyオリジンとして強調表示します。

my の s3/staticfiles/compressor セクション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カスタム ストレージを使用するときに、何かを誤って構成したのでしょうか?

4

4 に答える 4

10

設定は正しいようです。との両方STATICFILES_STORAGEを保持COMPRESS_STORAGEし、storage.CachedS3BotoStorageに戻してはいけませんstorages.backends.s3boto.S3BotoStorage

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

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-compressor の CACHE ディレクトリと収集された staticfiles ファイルの両方が S3 に表示されます。

于 2011-10-11T01:17:57.977 に答える
0

使用するdjango_compressor==1.2とうまくいきました。django-staticfiles をインストールする必要がある理由はわかりませんが、django_compressor1.2 を除くすべてのバージョンにその問題があります。

于 2013-08-09T09:29:18.550 に答える
0

何日にもわたる懸命な作業と調査の後、ようやくこれを行うことができ、gzipで圧縮して提供する方法も含め、詳細なガイドを書くことにしました.

基本的に、いくつかのことを行う必要があります。

  1. 使用するAWS_IS_GZIPPED = True
  2. S3 が米国外にある場合。変数を S3 URL にS3Connectionオーバーライドするカスタム クラスを作成する必要があります。DefaultHosts3-eu-west-1.amazonaws.com
  3. ドット付きバケット名を使用している場合、例subdomain.domain.tld. 設定する必要がありますAWS_S3_CALLING_FORMAT = 'boto.s3.connection.OrdinaryCallingFormat'
  4. あなたはあなたに設定する必要がnon_gzipped_file_content = content.fileありますCachedS3BotoStorage

これは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

これは、S3 の場所EUConnectionに設定したカスタム クラスであることに注意してください。DefaultHost完全なカスタム ストレージと settings.py については、より長く詳細なガイドを確認してください。

于 2015-05-06T17:36:23.307 に答える
0

Amazon S3 で多くの (複数の) manifest_%.json を作成する問題を修正するために、いくつかの行で上記のソリューションを完成させるこの投稿を試してください。 https://stackoverflow.com/a/31545361/1359475

于 2015-07-21T17:09:15.157 に答える