2012-02-07 2 views
14

В settings.py у меня есть:Указывая на несколько ведер S3 в s3boto

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

ответ

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) 

Затем укажите этот класс как ваши DEFAULT_FILE_STORAGE и оставить STATICFILES_STORAGE, как это, или наоборот.

+0

Ницца! Где вы рекомендуете поместить этот класс? – abstractpaper

+0

Где-то в вашем проекте. Обычно у меня есть отдельное приложение, где я сохраняю все специфические для проекта вещи. –

+1

Основное приложение это, спасибо большое. – abstractpaper

 Смежные вопросы

  • Нет связанных вопросов^_^