Django的存储器具有多个S3铲斗(django-storages with multiple S

2019-06-24 03:10发布

我使用AWS,我会在我的应用程序不同的桶。 我也使用Django的储量。 有没有指定我想将文件上传到该桶的方式(例如,如保存()函数或任何一个参数?)

我看到这个Django的-错误导入storages.backends ,但我不明白应该如何使用?

谢谢!

Answer 1:

S3BotoStorage取水桶名作为参数。 如果没有给它会使用AWS_STORAGE_BUCKET_NAME设置。 这意味着如果你想S3BotoStorage使用默认的存储后端DEFAULT_FILE_STORAGE那么它必须使用默认的水桶。

然而,你也可以指定在现场级存储:

from django.db import models
from storages.backends.s3boto import S3BotoStorage

class MyModel(models.Model):
    file_1 = models.FileField() # Uses default storage
    file_2 = models.FileField(storage=S3BotoStorage(bucket='other-bucket'))

编辑

评论越来越失控,所以我会更新我的答案。 实例的基础上更改存储后端的参数是不是东西,Django的存储API的设计做。 存储后端不具有模型实例的知识,因为该存储器可以在模型的上下文之外使用诸如静态文件。 并非完全不合理,但它不是那么的Django Django的或-存储器旨在解决使用。 我不指望你AREN找到存储后端的下降将处理这个要求。

该文档描述了如何可以手动管理文件: https://docs.djangoproject.com/en/1.9/topics/files/#storage-objects某处你至少需要存储在您保存该文件的水桶,让你当你查询模型以后能找到它。



Answer 2:

另一种解决方案,如果要指定在运行时斗,你可以调用模型上的save()方法之前完成。

按照上面的例子:

from django.db import models
from storages.backends.s3boto import S3BotoStorage

class MyModel(models.Model):
    file_1 = models.FileField() # Uses default storage
    file_2 = models.FileField()

在视图保存模型时,可以指定该字段存储。

my_file_model = MyModel()
my_file_model.file_2.storage = S3BotoStorage(bucket="your-bucket-name")
my_file_model.save()

这样file_2将被保存在桶里您指定file_1将使用默认的水桶。



Answer 3:

就在settings.py提到另一个名字斗与PRIVATE_BUCKET_NAME =“斗名”。

创造出超越S3BotoStorage和可序列化到迁移文件的自定义类。

创建用于一个类对象s3_storage = S3MediaStorage()并给它的存储在文件1场中为MyModel

from storages.backends.s3boto import S3BotoStorage
from django.conf import settings

@deconstructible
class S3MediaStorage(S3BotoStorage):
    def __init__(self, *args, **kwargs):
        kwargs['bucket'] = getattr(settings, 'PRIVATE_BUCKET_NAME')
        super(S3MediaStorage, self).__init__(*args, **kwargs)

s3_storage = S3MediaStorage()

class MyModel(models.Model):
    file = models.FileField()
    file1 = models.FileField(storage=s3_storage)


文章来源: django-storages with multiple S3 Buckets