2012-02-07 4 views
14

에서 여러 S3 버킷 가리키며 내가 가진 : 이것은 내 S3 버킷 static.mysite.com를 가리키는과 잘 작동 내가 manage.py collectstatic을 수행 할 때, 내 양동이에 모든 정적 파일을 업로드한다<code>settings.py</code>에서 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' 

. Image.save()가 호출 될 때

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

지금, 그것은 여전히 ​​것이다 그러나, 나는 다른 목적을 위해 사용하고 난이 같은 모델이있는 경우, 예를 들어, 웹 사이트의 특정 영역에서 사용하고자하는 또 다른 버킷이 AWS_STORAGE_BUCKET_NAME에있는 S3 버킷에 파일을 업로드하십시오. 그러나이 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

관련 문제