Указывает на несколько кодов S3 в s3boto

В 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, т.е. Иметь подключаемое легко изменяемое бэкэнд-хранилище.

Ответы

Ответ 1

Самый чистый способ для вас - создать подкласс 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 как есть, или наоборот.