指向s3boto中的多个S3存储桶

时间:2012-02-07 10:29:10

标签: django amazon-s3 django-storage

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时工作正常,它会将所有静态文件上传到我的存储桶。但是,我有另一个桶,我用它用于不同的目的,并希望在网站的某些区域使用,例如,如果我有这样的模型:

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

现在调用Image.save()时,它仍会将文件上传到AWS_STORAGE_BUCKET_NAME中的S3存储桶,但我希望此Image.save()指向另一个S3存储桶。这样做的任何干净方式?我不想在运行时更改settings.py,也不想实施任何违反django主要原则的做法,即具有可插入的易于更改的后端存储。

1 个答案:

答案 0 :(得分: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不变,反之亦然。