Django项目Amazon S3存储桶静态图片无法加载报AccessDenied错误
Django S3静态资源无法加载解决方案
1. 修复URL生成错误
你当前页面生成的图片链接存在渲染异常,URL末尾被错误拼接了HTML属性的转义内容:%22%20id=%22image%22%20style=%22width:%2040px;%20height:40px%22%3E,实际请求的资源路径并非你预期的/images/logo.png,这是模板语法错误导致的。
- 检查Django模板内的图片标签写法,正确的静态资源引用格式如下:
<img src="{% static 'images/logo.png' %}" id="image" style="width: 40px; height:40px">
- 确认你没有将标签的id、style等属性错误写入
{% static %}标签的参数内,导致多余内容被拼接到静态资源URL后。
2. 修复S3 AccessDenied权限错误
URL修复后如果仍返回访问拒绝错误,按以下步骤排查:
2.1 配置S3存储桶公共访问权限
- 进入S3控制台对应存储桶的「权限」 tab,关闭「阻止所有公共访问」的配置项(如果你的静态资源需要公开访问)
- 给存储桶添加如下Bucket Policy,允许公开读取资源:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::django-ecommerce-files/*" } ] }
2.2 核对Django S3配置
确认settings.py中django-storages的相关配置正确:
AWS_ACCESS_KEY_ID = "你的AWS访问密钥ID" AWS_SECRET_ACCESS_KEY = "你的AWS秘密访问密钥" AWS_STORAGE_BUCKET_NAME = "django-ecommerce-files" AWS_S3_REGION_NAME = "你的存储桶所属区域,例如ap-southeast-1" AWS_S3_CUSTOM_DOMAIN = f"{AWS_STORAGE_BUCKET_NAME}.s3.{AWS_S3_REGION_NAME}.amazonaws.com" # 静态资源配置 STATIC_URL = f"https://{AWS_S3_CUSTOM_DOMAIN}/" STATICFILES_STORAGE = "storages.backends.s3boto3.S3Boto3Storage"
2.3 检查文件对象权限
确认上传到S3的静态文件ACL属性为public-read,如果上传时未指定公开读取权限,即使存储桶配置了公共策略也会返回访问拒绝。你可以在S3控制台手动修改单文件权限,也可以在Django配置中添加参数自动设置上传文件的ACL:
AWS_S3_OBJECT_PARAMETERS = { 'ACL': 'public-read', 'CacheControl': 'max-age=86400', }
内容的提问来源于stack exchange,提问作者Arun George
相关产品推荐
相关产品推荐

