你可以尝试什么..
1. 确保您拥有正确的 S3 权限和策略。通过 AWS S3 控制台中的权限选项卡访问特定存储桶的“策略”。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Statement1",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::<your_bucket_name>/*"
},
{
"Sid": "Statement2",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::<your_bucket_name>/images/"
}
]
}
2. 在你的项目环境中安装 WhiteNoiseMiddleware & django-storages。
pip install whitenoise
pip install django-storages
3.在settings.py中添加以下内容到MIDDLEWARE=
'whitenoise.middleware.WhiteNoiseMiddleware',
4. 需要在settings.py 中添加以下内容才能正确处理来自 S3 的 URL。处理由 django 中间件和 django-storages 自动完成
STATICFILES_LOCATION = 'static'
MEDIAFILES_LOCATION = 'media'
AWS_S3_CUSTOM_DOMAIN = '%s.s3.amazonaws.com' % os.environ['BUCKET_NAME']
AWS_ACCESS_KEY_ID = os.environ['AWS_KEY']
AWS_SECRET_ACCESS_KEY = os.environ['AWS_ACC_KEY']
AWS_STORAGE_BUCKET_NAME = os.environ['BUCKET_NAME']
AWS_S3_FILE_OVERWRITE = False
AWS_DEFAULT_ACL = None
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
STATICFILES_STORAGE = 'storages.backends.s3boto3.S3StaticStorage'
MEDIA_ROOT = os.path.join (BASE_DIR, 'static/images/')
STATIC_ROOT = os.path.join (BASE_DIR, 'static')
STATIC_URL = "https://%s/%s/" % (AWS_S3_CUSTOM_DOMAIN, STATICFILES_LOCATION)
MEDIA_URL = "https://%s/%s/" % (AWS_S3_CUSTOM_DOMAIN, MEDIAFILES_LOCATION)
5. 用于瞄准上传到精确的 S3 Bucket 文件夹。 (额外的)
在 setting.py 中设置媒体根目录:
MEDIA_ROOT = os.path.join (BASE_DIR, 'static/images/')
在 models.py 中使用 ImageFiled 并添加 upload_to= 获取文件夹名称并在第一次上传时创建它!:
image_variable = models.ImageField(null=True, default="{default_filename)", upload_to='uploads/')
参考:django-storages,whiteNoiseMiddelware,S3 Access Troubleshooting