如何在Django中使用django-storages来处理媒体文件和静态文件?

6
1个回答

11

DEFAULT_FILE_STORAGESTATICFILES_STORAGE 都配置为使用 S3 存储是可能的。但是,如果您设置

DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3BotoStorage'
STATICFILES_STORAGE = 'storages.backends.s3boto.S3BotoStorage'

那么这两个将都使用 S3 存储的默认设置,这意味着它们都将使用 AWS_STORAGE_BUCKET_NAME 存储桶。解决方法是在您的项目中创建一个小的 S3BotoStorage 子类,该子类使用不同的存储桶名称设置。

from django.conf import settings

from storages.backends.s3boto import S3BotoStorage

class S3StaticStorage(S3BotoStorage):

    def __init__(self, *args, **kwargs):
        kwargs['bucket']  = settings.AWS_STATIC_BUCKET_NAME
        super(S3StaticStorage, self).__init__(*args, **kwargs)

然后,您需要定义AWS_STATIC_BUCKET_NAME设置为您静态桶的名称,并将AWS_STATIC_BUCKET_NAME更改为此自定义存储类的路径。

STATICFILES_STORAGE = 'dotted.path.to.storage.S3StaticStorage'

如果您想更改其他设置,如AWS_QUERYSTRING_AUTHAWS_S3_CUSTOM_DOMAINAWS_PRELOAD_METADATA等,则也应在此子类中更改它们。


谢谢Mark。在回到您更具扩展性的解决方案之前,我最终所做的是子类化存储,但在类上覆盖bucket_name属性为bucket_name = setting('S3_STATIC_STORAGE_BUCKET_NAME') - Johnny 5
没错,这是相同的基本思路。两者都解决了主要问题,即STATICFILES_STORAGE使用的存储将使用默认参数和关键字参数进行初始化,因此您需要确保这些默认值是您想要的。 - Mark Lavin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接