2012-02-07 63 views
14

settings.py我:指向多個S3水桶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' 

這是指着我的S3存儲static.mysite.com和工作正常,當我做manage.py collectstatic,它上傳所有的靜態文件到我的水桶。不過,我還有一個水桶,我用不同的目的,想在網站上的某些地區使用,例如,如果我有這樣一個模型:

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

現在,當被調用Image.save(),它仍然會將文件上傳到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 2012-02-07 10:55:43

+0

您的項目中的某個地方。我通常有獨立的應用程序,我保留所有項目的具體事情。 – 2012-02-07 11:08:16

+1

核心應用程序,非常感謝。 – abstractpaper 2012-02-07 12:19:45