2012-02-07 10 views
14

W settings.py mam:Wskazując na wielu wiader S3 w 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' 

ten jest skierowany do mojego S3 wiadra static.mysite.com i działa dobrze, gdy robię manage.py collectstatic, to ładuje wszystkie pliki statyczne do mojego wiadra. Jednak mam inny wiadro, które używać do różnych celów, a chcieliby skorzystać w niektórych obszarach strony internetowej, na przykład jeśli mam model takiego:

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

Teraz kiedy Image.save() jest wywoływana, to będzie nadal prześlij plik do wiadra S3 w AWS_STORAGE_BUCKET_NAME, ale chcę, aby to Image.save() wskazywało inne wiadro S3. Czy można to zrobić w dowolny sposób: clean? Nie chcę zmieniać settings.py w czasie wykonywania ani implementować żadnych praktyk, które naruszają kluczowe zasady django, tj. Posiadające wtyczkową, łatwą do zmiany pamięć zaplecza.

Odpowiedz

23

Najczystszym sposobem jest utworzenie podklasy S3BotoStorage i zastąpienie domyślnej nazwy zasobnika w metodzie 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) 

Następnie określ tę klasę jako swojej DEFAULT_FILE_STORAGE i pozostawić STATICFILES_STORAGE jak jest, albo vice versa.

+0

Nice! Gdzie polecasz tę klasę? – abstractpaper

+0

Gdzieś w projekcie. Zwykle mam osobną aplikację, w której trzymam wszystkie rzeczy związane z konkretnym projektem. –

+1

podstawowa aplikacja to, wielkie dzięki. – abstractpaper

Powiązane problemy