在settings.py
我有:
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'
这指向我的S3存储桶static.mysite.com
并且当我执行manage.py collectstatic
时工作正常,它会将所有静态文件上传到我的存储桶。但是,我有另一个桶,我用它用于不同的目的,并希望在网站的某些区域使用,例如,如果我有这样的模型:
class Image(models.Model):
myobject = models.ImageField(upload_to='my/folder')
现在调用Image.save()
时,它仍会将文件上传到AWS_STORAGE_BUCKET_NAME
中的S3存储桶,但我希望此Image.save()
指向另一个S3存储桶。这样做的任何干净方式?我不想在运行时更改settings.py
,也不想实施任何违反django主要原则的做法,即具有可插入的易于更改的后端存储。
答案 0 :(得分: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
不变,反之亦然。