2012-02-07 4 views
14

で複数のS3バケットにポインティング私が持っている:これは私のS3バケットstatic.mysite.comを指していると正常に動作します私はmanage.py collectstaticを行うとき、それは私のバケットにすべての静的ファイルをアップロードしている<code>settings.py</code>でs3boto

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' 

。今Image.save()が呼び出されると、それはまだ意志

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

:しかし、私は別の目的に使用して、私はこのようなモデルを持っている場合、たとえば、ウェブサイトの特定の領域で使用したい別のバケツを持っていますファイルをAWS_STORAGE_BUCKET_NAMEのS3バケットにアップロードしてください。ただし、Image.save()を別のS3バケットを参照してください。任意クリーンこれを行う方法?実行時にsettings.pyを変更したり、Djangoの重要な原則に違反するプラクティスを実装したりすることはできません。すなわち、プラガブルな変更が容易なバックエンドストレージを持つことです。

答えて

23

最も簡単な方法は、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) 

次に、あなたのDEFAULT_FILE_STORAGEとして、このクラスを指定し、そのままSTATICFILES_STORAGEを残す、またはその逆。

+0

ニース!このクラスを入れる場所はどこですか? – abstractpaper

+0

あなたのプロジェクトのどこかに。私は通常、私がすべてのプロジェクト固有のものを保持する別のアプリを持っています。 –

+1

コアアプリです、ありがとうございます。 – abstractpaper

関連する問題