Django - Oracle Cloud Bucket 与 django-storages 集成

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

我已将

django-storages
配置为指向 OCI 存储桶。以下是配置:

    AWS_S3_ACCESS_KEY_ID = env('AWS_BUCKET_KEY')
    AWS_SECRET_ACCESS_KEY = env('AWS_BUCKET_SECRET')
    AWS_BUCKET_NAMESPACE = env('AWS_BUCKET_NAMESPACE')
    AWS_STORAGE_BUCKET_NAME = env('AWS_BUCKET_NAME')
    AWS_S3_BUCKET_REGION = env('AWS_S3_BUCKET_REGION')
    
    AWS_S3_ENDPOINT_URL = f'https://{AWS_BUCKET_NAMESPACE}.compat.objectstorage. {AWS_S3_BUCKET_REGION}.oraclecloud.com'
    AWS_S3_OBJECT_PARAMETERS = {
        'CacheControl': 'max-age=86400',
    }
    AWS_LOCATION = f'{AWS_S3_ENDPOINT_URL}/{AWS_STORAGE_BUCKET_NAME}'
    AWS_DEFAULT_ACL = 'public-read'
    
    STATICFILES_STORAGE = 'custom_storages.StaticStorage'
    DEFAULT_FILE_STORAGE = 'custom_storages.MediaStorage'

    # Use AWS_S3_ENDPOINT_URL here if you haven't enabled the CDN and got a custom domain. 
    STATIC_URL = '{}/{}/'.format(AWS_LOCATION, 'static')
    STATIC_ROOT = 'var/static/'
    STATICFILES_DIRS = [
        BASE_DIR / "static"
    ]
    
    MEDIA_URL = '{}/{}/'.format(AWS_LOCATION, 'media')
    MEDIA_ROOT = 'media/'

这是自定义存储配置

from django.conf import settings
from storages.backends.s3boto3 import S3Boto3Storage

class StaticStorage(S3Boto3Storage):
    bucket_name = settings.AWS_STORAGE_BUCKET_NAME
    location = 'static'

class MediaStorage(S3Boto3Storage):
    bucket_name = settings.AWS_STORAGE_BUCKET_NAME
    location = 'media'

我的所有静态文件都已提供,没有任何问题,但应用程序根本无法识别样式文件。

此外,当我尝试上传新文件时,会出现以下错误:

botocore.exceptions.ClientError: An error occurred (SignatureDoesNotMatch) when calling the PutObject operation: 
The secret key required to complete authentication could not be found. The region must be specified if this is not the home region for the tenancy.

可能是什么问题?

------更新------

对于这个问题:

此外,当我尝试上传新文件时,会出现以下错误:

botocore.exceptions.ClientError: An error occurred (SignatureDoesNotMatch) when calling the PutObject operation: 
The secret key required to complete authentication could not be found. The region must be specified if this is not the home region for the tenancy.

通过在自定义存储类中添加键解决了这个问题:

from django.conf import settings
from storages.backends.s3boto3 import S3Boto3Storage

class StaticStorage(S3Boto3Storage):
    access_key = settings.AWS_S3_ACCESS_KEY_ID
    secret_key = settings.AWS_SECRET_ACCESS_KEY
    bucket_name = settings.AWS_STORAGE_BUCKET_NAME
    region_name = settings.AWS_S3_BUCKET_REGION
    location = 'static'

class MediaStorage(S3Boto3Storage):
    access_key = settings.AWS_S3_ACCESS_KEY_ID
    secret_key = settings.AWS_SECRET_ACCESS_KEY
    bucket_name = settings.AWS_STORAGE_BUCKET_NAME
    region_name = settings.AWS_S3_BUCKET_REGION
    location = 'media'

风格不体现的问题仍然存在。

django boto3 oracle-cloud-infrastructure django-storage
1个回答
0
投票

您看到的错误消息 botocore.exceptions.ClientError:调用 PutObject 操作时发生错误 (SignatureDoesNotMatch),通常表示您的 AWS 凭证(访问密钥 ID 和秘密访问密钥)存在问题。

您可以检查以下几项:

检查您的凭证:确保 AWS_S3_ACCESS_KEY_ID 和 AWS_SECRET_ACCESS_KEY 值正确。这些应该是您的 AWS 账户中具有访问 S3 存储桶所需权限的 IAM 用户的访问密钥 ID 和秘密访问密钥。

检查您的存储桶名称:确保 AWS_STORAGE_BUCKET_NAME 值正确并且该存储桶存在于您的 AWS 账户中。

检查您的区域:错误消息还提到必须指定区域。确保 AWS_S3_BUCKET_REGION 值正确并且与您的 S3 存储桶所在的区域匹配。

检查您的终端节点 URL:AWS_S3_ENDPOINT_URL 应正确且可访问。您似乎正在使用 Oracle 云基础设施 (OCI) 对象存储服务,请确保端点 URL 根据 OCI 文档正确。

如果您检查了所有这些内容,但仍然看到错误,那么尝试直接使用 boto3 库(在 Django 和 django-storages 之外)连接到您的 S3 存储桶并执行简单的操作可能是个好主意操作,例如列出桶中的对象。这可以帮助您确定问题是与您的 AWS 凭证有关还是与 django-storages 使用它们的方式有关。

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