2012-02-07 19 views
14

Trong settings.py tôi có:Chỉ vào nhiều xô S3 trong 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' 

này được trỏ đến S3 của tôi xô static.mysite.com và hoạt động tốt khi tôi làm manage.py collectstatic, nó upload tất cả các file tĩnh để xô tôi. Tuy nhiên, tôi có một xô mà tôi sử dụng cho các mục đích khác nhau và muốn sử dụng trong khu vực nhất định của trang web, ví dụ như nếu tôi có một mô hình như thế này:

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

Bây giờ khi Image.save() được gọi, nó sẽ vẫn tải tệp lên thùng S3 trong AWS_STORAGE_BUCKET_NAME, tuy nhiên tôi muốn điều này Image.save() để trỏ đến một thùng S3 khác. Bất kỳ làm sạch cách thực hiện việc này? Tôi không muốn thay đổi settings.py trong thời gian chạy cũng như không triển khai bất kỳ thực tiễn nào vi phạm nguyên tắc chính của django, tức là có bộ nhớ phụ trợ dễ thay đổi có thể cắm được.

Trả lời

23

Cách sạch nhất để bạn có thể tạo lớp con của S3BotoStorage và ghi đè tên nhóm mặc định trong phương thức 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) 

Sau đó, xác định lớp này như DEFAULT_FILE_STORAGE bạn và để lại STATICFILES_STORAGE như nó có, hoặc ngược lại.

+0

Tuyệt vời! Bạn đề nghị đặt lớp này ở đâu? – abstractpaper

+0

Một nơi nào đó trong dự án của bạn. Tôi thường có ứng dụng riêng biệt, nơi tôi giữ tất cả mọi thứ cụ thể của dự án. –

+1

ứng dụng cốt lõi, cảm ơn rất nhiều. – abstractpaper