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

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

现在当Image.save()被调用时,它仍然会将文件上传到 S3 存储桶中AWS_STORAGE_BUCKET_NAME,但是我希望它Image.save()指向另一个 S3 存储桶。有什么干净的方法吗?我不想改变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)

然后将此类指定为您的DEFAULT_FILE_STORAGE并保持STATICFILES_STORAGE原样,反之亦然。

于 2012-02-07T10:44:28.117 回答