我已将
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'
风格不体现的问题仍然存在。
您看到的错误消息 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 使用它们的方式有关。