首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >django-具有多个S3存储桶的存储

django-具有多个S3存储桶的存储
EN

Stack Overflow用户
提问于 2012-05-03 02:05:53
回答 4查看 11.1K关注 0票数 28

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

我看到了这个Django - Error importing storages.backends,但我不明白它应该如何使用?!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-05-03 02:30:40

S3BotoStorage以存储桶名称作为参数。如果没有给出,它将使用AWS_STORAGE_BUCKET_NAME设置。这意味着如果你想让S3BotoStorage成为DEFAULT_FILE_STORAGE的默认存储后端,那么它必须使用默认的存储桶。

但是,您也可以在字段级别上分配存储:

代码语言:javascript
运行
复制
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-storages想要解决的用法。我不期望你能在存储后端找到一个能帮你解决这个问题的地方。

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

票数 28
EN

Stack Overflow用户

发布于 2014-12-18 16:14:51

另一种解决方案如果您想在运行时指定bucket,则可以在对模型调用save()方法之前执行此操作。

下面是上面的例子:

代码语言:javascript
运行
复制
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()

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

代码语言:javascript
运行
复制
my_file_model = MyModel()
my_file_model.file_2.storage = S3BotoStorage(bucket="your-bucket-name")
my_file_model.save()

这样,file_2将保存在您指定的存储桶中,file_1将在其中使用您的默认存储桶。

票数 11
EN

Stack Overflow用户

发布于 2016-08-31 19:22:40

只需在带有PRIVATE_BUCKET_NAME='bucket name‘的settings.py中提及另一个bucket名称。

创建一个自定义类,它覆盖S3BotoStorage,并可以将其序列化为迁移文件。

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

代码语言:javascript
运行
复制
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)
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10419248

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档