在Django中分离S3上的开发/暂存/生产介质桶

2024-09-28 05:41:13 发布

您现在位置:Python中文网/ 问答频道 /正文

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

# 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,
    )
    [...]

问题在于bucket密钥在设置文件中是硬编码的,并且由于存在多个developers+1 staging environment,因此出于测试/QA目的上传的所有垃圾文件最终都与实际生产数据位于同一个S3 bucket中

一个明显的解决方案是重写staging_settings.pydevelopment_settings.py文件中的AWS_MEDIA_STORAGE_BUCKET_NAME,但这将使生产数据在登台和测试实例上不可用。为了实现这一点,我们需要知道如何将生产bucket同步到dev/staging bucket,我不确定如何高效无缝地完成这一点

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

如何处理?将测试和生产介质文件放在同一个存储桶中是否是一个问题(在我开始考虑如何处理它之前,我确信这是一个问题)?一般来说,分离开发/暂存/生产云存储的一些最佳实践是什么


Tags: djangofrompyimportawssettingsbucketmodels

热门问题