16

settings.py私は持っています:

STATICFILES_STORAGE = 'storages.backends.s3boto.S3BotoStorage'

DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3BotoStorage'
AWS_ACCESS_KEY_ID = 'xxxxxxxxxxxxx'
AWS_SECRET_ACCESS_KEY = 'xxxxxxxxxxxxx'
AWS_STORAGE_BUCKET_NAME = 'static.mysite.com'

これは私の S3 バケットを指しており、static.mysite.com実行すると正常に動作しmanage.py collectstatic、すべての静的ファイルがバケットにアップロードされます。ただし、さまざまな目的で使用し、Web サイトの特定の領域で使用したい別のバケットがあります。たとえば、次のようなモデルがある場合です。

class Image(models.Model):
    myobject = models.ImageField(upload_to='my/folder')

Image.save()が呼び出されると、ファイルは の S3 バケットにアップロードされますが、別の S3 バケットを指すようAWS_STORAGE_BUCKET_NAMEにしたいと考えています。Image.save()これを行うクリーン方法はありますか?私は実行時に変更したくありませんしsettings.py、django の重要な原則に違反する慣行を実装したくもありません。つまり、プラグイン可能で簡単に変更できるバックエンド ストレージを使用することです。

4

1 に答える 1

24

最もクリーンな方法は、S3BotoStorage のサブクラスを作成し、init メソッドでデフォルトのバケット名をオーバーライドすることです。

from django.conf import settings
from storages.backends.s3boto import S3BotoStorage

class MyS3Storage(S3BotoStorage):
    def __init__(self, *args, **kwargs):
        kwargs['bucket'] = getattr(settings, 'MY_AWS_STORAGE_BUCKET_NAME')
        super(MyS3Storage, self).__init__(*args, **kwargs)

次に、このクラスを your として指定し、DEFAULT_FILE_STORAGEそのままSTATICFILES_STORAGEにしておくか、その逆を行います。

于 2012-02-07T10:44:28.117 に答える