Django 无法从开发服务器中的 aws S3 加载媒体文件



媒体文件已正确上传到 aws s3 存储桶,但不会呈现到 html 页面。谁能帮我解决这个问题?我找不到问题所在。

错误

如果我单击下图的链接,将显示错误。

<Error>
<Code>InvalidRequest</Code>
<Message>
The authorization mechanism you have provided is not supported. Please 
use AWS4-HMAC-SHA256.
</Message>
<RequestId>C6FE9209F5DE6296</RequestId>
<HostId>
ry5ZRPCWjDxcxsYzII8q+x6BVMzRRiqvU1kZYxA5OQd07ojkyaqGoAd/OI=
</HostId>
</Error>

settings.py

变量设置如下所示。

MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'
CRISPY_TEMPLATE_PACK = 'bootstrap4'
AWS_ACCESS_KEY_ID = os.environ.get('AWS_ACCESS_KEY_ID')
AWS_SECRET_ACCESS_KEY = os.environ.get('AWS_SECRECT_ACCESS_KEY')
AWS_STORAGE_BUCKET_NAME = os.environ.get('AWS_STORAGE_BUCKET_NAME')
AWS_S3_FILE_OVERWRITE = False
AWS_DEFAULT_ACL = None
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'

您可能需要添加

AWS_S3_SIGNATURE_VERSION = "s3v4"

以确保 S3 未使用 v2,并非所有区域都支持该 v2。我对 S3 的完整设置是:

#AWS S3 settings
AWS_ACCESS_KEY_ID = os.environ.get('AWS_ACCESS_KEY_ID', '')
AWS_SECRET_ACCESS_KEY = os.environ.get('AWS_SECRET_ACCESS_KEY', '')
AWS_STORAGE_BUCKET_NAME = os.environ.get('AWS_STORAGE_BUCKET_NAME', '')
AWS_S3_CUSTOM_DOMAIN = '%s.s3.amazonaws.com' % AWS_STORAGE_BUCKET_NAME
AWS_S3_REGION_NAME = "eu-central-1"
AWS_S3_SIGNATURE_VERSION = "s3v4"
AWS_S3_OBJECT_PARAMETERS = {
'CacheControl': 'max-age=86400',
}
AWS_STATIC_LOCATION = 'static'

错误的原因是桶策略是空的。我添加了策略,现在它工作正常。策略如下所示(注意:我在以下策略中授予了公共访问权限,大多数时候不建议使用(。

{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "allow-file-download-stmt",
"Effect": "Allow",
"Principal":"*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::zen-blogs/*"
}
]
}

最新更新