Указание на несколько сегментов S3 в s3boto - PullRequest
14 голосов
/ 07 февраля 2012

В 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 Ответ

23 голосов
/ 07 февраля 2012

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

...