2012-02-07 16 views
14

En settings.py tengo:Señalando a múltiples cubos S3 en 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' 

Esto está apuntando a mi S3 cubo static.mysite.com y funciona bien cuando lo haga manage.py collectstatic, que cargue todos los archivos estáticos a mi cubo. Sin embargo, tengo otro cubo que utilizo para diferentes propósitos y me gustaría usar en ciertas áreas del sitio web, por ejemplo, si tengo un modelo como este:

class Image(models.Model): 
    myobject = models.ImageField(upload_to='my/folder') 

Ahora, cuando Image.save() se invoca, éste seguirá cargue el archivo en el depósito S3 en AWS_STORAGE_BUCKET_NAME; sin embargo, quiero que este Image.save() apunte a otro cubo S3. Cualquier limpia forma de hacer esto? No quiero cambiar settings.py en tiempo de ejecución ni implementar ninguna práctica que viole los principios clave de django, es decir, que tenga un almacenamiento de backend fácil de cambiar conectable.

Respuesta

23

La manera más limpia para usted sería crear una subclase de S3BotoStorage y anular el nombre del cubo predeterminado en el método 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) 

continuación, especifique esta clase como su DEFAULT_FILE_STORAGE y dejar STATICFILES_STORAGE como es, o viceversa.

+0

¡Agradable! ¿Dónde recomiendas colocar esta clase? – abstractpaper

+0

En algún lugar de su proyecto. Normalmente tengo una aplicación separada donde guardo todas las cosas específicas del proyecto. –

+1

aplicación central es, muchas gracias. – abstractpaper

Cuestiones relacionadas