带有多个S3存储桶的django存储

abi*_*son 23 django amazon-web-services python-django-storages

我正在使用AWS,我的应用程序中会有不同的存储桶.我也在使用Django-Storages.有没有办法指定我要将文件上传到哪个存储桶(例如,作为Save()函数中的参数或其他什么?)

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

谢谢!

Mar*_*vin 24

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'))
Run Code Online (Sandbox Code Playgroud)

编辑:

评论失控,所以我会更新我的答案.在实例的基础上更改存储后端的参数不是Django存储API旨在执行的操作.存储后端不了解模型实例,因为存储可以在模型的上下文之外使用,例如使用静态文件.并非完全不合理,但这不是Django或django-storage打算解决的用法.我不希望你找到一个可以为你处理这个问题的存储后端.

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

  • 在某些时候,此参数似乎已更改为“bucket_name”,并且使用“bucket”将返回错误:“django.core.exceptions.ImproperlyConfigured:S3Boto3Storage 的设置“bucket”无效”。请参阅“django-storages”源:https://github.com/jschneier/django-storages/blob/738347ecfcf3e6354888f1100f7b336c729d5082/storages/backends/s3boto3.py#L293。 (6认同)

Waq*_*ved 8

另一种解决方案是,如果要在运行时指定存储区,可以在调用模型上的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()
Run Code Online (Sandbox Code Playgroud)

在保存模型时的视图中,您可以在该字段上指定存储.

my_file_model = MyModel()
my_file_model.file_2.storage = S3BotoStorage(bucket="your-bucket-name")
my_file_model.save()
Run Code Online (Sandbox Code Playgroud)

这样,file_2将保存在您指定的存储区中,file_1将使用您的默认存储区.


PSN*_*PSN 7

对于 S3Boto3Storage 使用以下命令:

media_file = models.FileField('media file', storage=S3Boto3Storage(bucket_name='media_bucket'), upload_to='media', blank=True)
Run Code Online (Sandbox Code Playgroud)


Pri*_*tln 6

只需在settings.py中使用PRIVATE_BUCKET_NAME ='bucket name' 提及另一个存储桶名称即可。

创建一个覆盖S3BotoStorage的自定义类,该类可以序列化为迁移文件。

为类创建一个对象,s3_storage = S3MediaStorage()并将其存储在MyModel的file1字段中

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)
Run Code Online (Sandbox Code Playgroud)