指向s3boto中的多个S3存储桶

Azi*_*ari 14 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'
Run Code Online (Sandbox Code Playgroud)

这指向我的S3存储桶static.mysite.com并且在我这样做时工作正常manage.py collectstatic,它将所有静态文件上传到我的存储桶.不过,我还有一个水桶,我用不同的目的,想如果我有这样的模型在网站的某些地区使用,例如:

class Image(models.Model):
    myobject = models.ImageField(upload_to='my/folder')
Run Code Online (Sandbox Code Playgroud)

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

And*_*nyi 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)
Run Code Online (Sandbox Code Playgroud)

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