2012-02-07 12 views
14

In settings.py ho:Indicando più secchi S3 in 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' 

Questa è rivolto al mio S3 secchio static.mysite.com e funziona bene quando lo faccio manage.py collectstatic, si carica tutti i file statici al mio secchio. Tuttavia, ho un altro secchio che io uso per scopi diversi e vorrei utilizzare in determinate aree del sito, ad esempio se ho un modello come questo:

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

Ora, quando Image.save() viene invocato, sarà ancora caricare il file nel secchio S3 in AWS_STORAGE_BUCKET_NAME, tuttavia voglio che questo sia Image.save() che punta a un altro bucket S3. Qualsiasi clean modo di fare questo? Non voglio modificare settings.py in fase di esecuzione né implementare pratiche che violano i principi chiave di django, ovvero avere una memoria di backend facile da modificare e collegabile.

risposta

23

Il modo più semplice per voi sarebbe creare una sottoclasse di S3BotoStorage e sovrascrivere il nome del bucket predefinito nel metodo 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) 

Poi specificare questa classe come DEFAULT_FILE_STORAGE e lasciare STATICFILES_STORAGE così com'è, o viceversa.

+0

Bello! Dove raccomandi di inserire questo corso? – abstractpaper

+0

Da qualche parte nel tuo progetto. Di solito ho un'app separata dove tengo tutte le cose specifiche del progetto. –

+1

app principale, grazie mille. – abstractpaper

Problemi correlati