在 Django 的 S3 上分离开发/登台/生产媒体桶

如何解决在 Django 的 S3 上分离开发/登台/生产媒体桶

我们目前使用 AWS S3 存储桶作为 Django 1.11 项目中媒体文件的存储(使用 S3BotoStorage 库中的 django-storages)。相关代码在这里

# storage.py

from storages.backends.s3boto import S3BotoStorage


class MediaRootS3BotoStorage(S3BotoStorage):
    """Storage for uploaded media files."""
    bucket_name = settings.AWS_MEDIA_STORAGE_BUCKET_NAME
    custom_domain = domain(settings.MEDIA_URL)
# common_settings.py

DEFAULT_FILE_STORAGE = 'storage.MediaRootS3BotoStorage'
AWS_MEDIA_STORAGE_BUCKET_NAME = 'xxxxxxxxxxxxxxxx'
MEDIA_URL = "//media.example.com/"
# models.py
import os
import uuid

from django.db import models
from django.utils import timezone
from django.utils.module_loading import import_string


def upload_to_unique_filename(instance,filename):
    try:
        extension = os.path.splitext(filename)[1]
    except Exception:
        extension = ""
    Now = timezone.Now()

    return f'resume/{Now.year}/{Now.month}/{uuid.uuid4()}{extension}'


class Candidate(models.Model):
    [...]
    resume = models.FileField(
        storage=import_string(settings.DEFAULT_PRIVATE_FILE_STORAGE)(),upload_to=upload_to_unique_filename,)
    [...]

问题是存储桶密钥在设置文件中进行了硬编码,并且由于有多个开发人员 + 1 个登台环境,所有为测试/QA 目的上传垃圾文件最终都与真实的生产数据。

一个明显的解决方案是覆盖 AWS_MEDIA_STORAGE_BUCKET_NAMEstaging_settings.py 文件中的 development_settings.py,但这会使生产数据在暂存和测试实例上不可用。为了完成这项工作,我们会以某种方式将生产存储桶同步到开发/暂存存储桶,我不确定如何高效无缝地做到这一点。

另一种选择是在开发和登台环境中使用本地文件系统进行媒体存储。这还需要下载大量媒体文件,并且会将堆栈的一部分(django-storages 和 S3 API)排除在测试/质量检查流程之外。

如何处理?在同一个存储桶中混合测试和生产媒体文件是否是一个问题(我确定这是直到我开始考虑如何处理它)?一般而言,有哪些关于分离开发/暂存/生产云存储的最佳做法?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?