我在我的 Django 应用程序中使用boto3和django- storages来提供来自 AWS S3 的文件。我希望我的静态文件是公开的,但其他文件是私有的。我已经让它有点工作但不完全。我的静态文件就像是私有的一样被提供,带有一个预签名的密钥。在我使用时的模板文件中:
<img src="{% static 'images/3d-house-nav-gray.png' %}">
而不是我想要的
<img src="https://mybucket.s3.amazonaws.com/static/images/3d-house-nav-gray.png">
我越来越
<img id="home-img" src="https://mybucket.s3.amazonaws.com/static/images/3d-house-nav-gray.png?AWSAccessKeyId=AKIA1234564LQ7X4EGHK&Signature=123456gIBTFlTQKCexLo3UJmoPs%3D&Expires=1621693552">
当模板作为 HTTPResponse 的一部分从服务器呈现时,这实际上是有效的,但当像这样的图像只是作为 .css 文件的一部分包含时则不行。在这种情况下,我会得到:
Failed to load resource: the server responded with a status of 403 (Forbidden)
(我发现如果我复制并粘贴有问题的图像链接并将其替换为&
然后&
我可以访问,那就更神秘了。)
这是我配置 AWS 的方式:
AWS_ACCESS_KEY_ID = os.environ['AWS_ACCESS_KEY_ID']
AWS_SECRET_ACCESS_KEY = os.environ['AWS_SECRET_ACCESS_KEY']
AWS_STORAGE_BUCKET_NAME = 'mybucket'
AWS_S3_OBJECT_PARAMETERS = {
'CacheControl': 'max-age=86400',
}
AWS_DEFAULT_ACL = None
AWS_LOCATION = 'static'
STATICFILES_STORAGE = 'myapp.storage_backends.StaticStorage'
DEFAULT_FILE_STORAGE = 'myapp.storage_backends.MediaStorage'
AWS_S3_URL = 'https://%s.s3.amazonaws.com' % AWS_STORAGE_BUCKET_NAME
STATIC_DIRECTORY = '/static/'
MEDIA_DIRECTORY = '/media/'
STATIC_URL = AWS_S3_URL + STATIC_DIRECTORY
MEDIA_URL = AWS_S3_URL + MEDIA_DIRECTORY
其中myapp.storage_backends.py
包含:
from storages.backends.s3boto3 import S3Boto3Storage
class MediaStorage(S3Boto3Storage):
location = 'media'
file_overwrite = False
class StaticStorage(S3Boto3Storage):
location = 'static'
file_overwrite = True
在 AWS S3 上,我的存储桶策略设置如下:
{
"Version": "2012-10-17",
"Id": "Policy1621539673651",
"Statement": [
{
"Sid": "Stmt1621539665305",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::063896663644:user/mylogin"
},
"Action": [
"s3:GetObject",
"s3:GetObjectAcl",
"s3:PutObject",
"s3:PutObjectAcl"
],
"Resource": "arn:aws:s3:::mybucket/*"
},
{
"Sid": "Stmt1621539600741",
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::mybucket/static/*"
}
]
}
如何解决此问题以使某些文件(如 static/ 中的所有内容)未签名和公开,但其他文件已签名和私有?