Django 存储+ boto3 不起作用。将媒体文件上传到 S3 时将静态文件保留在本地

问题描述 投票:0回答:1

我正在尝试设置一个 django 项目,将静态文件保存在文件系统中,并将媒体文件上传到亚马逊 s3 存储桶。 django 存储库有 django>4.2 的更新。这曾经很容易,现在,它不适用于新设置:

STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
STATICFILES_STORAGE = 'django.core.files.storage.FileSystemStorage'

# Check if running in a production environment
STORAGES = {
    'default': {
        'BACKEND': 'storages.backends.s3boto3.S3Boto3Storage',
        'OPTIONS': {
            'bucket_name': os.getenv('AWS_STORAGE_BUCKET_NAME'),
            'region_name': os.getenv('AWS_S3_REGION_NAME', 'us-east-1'),
            'default_acl': 'public-read',
            'file_overwrite': False,
            'custom_domain': f'{os.getenv("AWS_STORAGE_BUCKET_NAME")}.s3.{os.getenv("AWS_S3_REGION_NAME", "us-east-1")}.amazonaws.com',
        },
    },
    'staticfiles': {
        'BACKEND': 'django.core.files.storage.FileSystemStorage',
        'OPTIONS': {
            'location': STATIC_ROOT,
        },
    }
}
# django-storages configuration for media files
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
MEDIA_URL = f'https://{os.getenv("AWS_STORAGE_BUCKET_NAME")}.s3.{os.getenv("AWS_S3_REGION_NAME", "us-east-1")}.amazonaws.com/media/'

从服务器访问站点时,静态文件仍然指向s3存储桶,例如:

us-east-1.amazonaws.com/media/admin/css/dark_mode.css

这是 django admin 的基本 css。但为什么它要在 /media/ 中寻找文件?

django amazon-s3 boto3 python-django-storages
1个回答
0
投票

我认为你可以摆脱 Boto3 并使用默认的 storages.backends.s3.S3Storage 后端,而且你还必须通过选项或环境变量传递 AWS 密钥。请参阅下面的工作代码,但在我的例子中,将静态文件和媒体文件存储在 Yandex S3 中。

ENDPOINT = 'storage.yandexcloud.net'
ENDPOINT_URL = 'https://' + ENDPOINT

STATIC_URL = f"{ENDPOINT_URL}/{env.str("BUCKET_NAME")}/static/"
MEDIA_URL = f"{ENDPOINT_URL}/{env.str("BUCKET_NAME")}/media/"

default_storage_backend = "storages.backends.s3.S3Storage"
default_storage_options = {
    "access_key": env.str("YOS_ACCESS_KEY"),
    "secret_key": env.str("YOS_SECRET_KEY"),
    "bucket_name": env.str("BUCKET_NAME"),
    "region_name": env.str("BUCKET_REGION"),
    "endpoint_url": ENDPOINT_URL,
    "custom_domain": f"{ENDPOINT}/{env.str('BUCKET_NAME')}",
    "default_acl": 'public-read',
    "querystring_auth": False,
    "file_overwrite": True,
}
STORAGES = {
    "staticfiles": {
        "BACKEND": default_storage_backend,
        "OPTIONS": {
            **default_storage_options,
            "location": "static",
        } 
    },
    "default": {
        "BACKEND": default_storage_backend,
        "OPTIONS": {
            # add or override options defined in default
            **default_storage_options,
            "location": "media",
        },
    },
}

及环境:

YOS_ACCESS_KEY='...'
YOS_SECRET_KEY='...'
BUCKET_NAME=...
BUCKET_REGION=... 

对于 AWS 来说应该是:

"custom_domain": f"{env.str(BUCKET_NAME)}.{ENDPOINT}",

ENDPOINT = 's3.amazonaws.com'
ENDPOINT_URL = f"https://{env.str(BUCKET_NAME)}.{ENDPOINT}"
...
STATIC_URL = f"{ENDPOINT_URL}/static/"
MEDIA_URL = f"{ENDPOINT_URL}/media/"

我认为您可以保持静态不变,仅更改媒体文件的默认存储。

我使用了https://forum.djangoproject.com/t/storage-4-2-how-to-subclass-default/29190/3官方文档在这里https://django-storages.readthedocs。 io/en/stable/backends/amazon-S3.html

© www.soinside.com 2019 - 2024. All rights reserved.