Указывает на несколько кодов 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
как есть, или наоборот.