2012-02-07 72 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