Django + AWS s3可以上传文件但不能访问它们

cre*_*eyD 2 django amazon-s3 amazon-web-services boto3 python-django-storages

在本教程之后,我将我们的系统设置为使用 boto3 和 Django 存储来使用 Amazon S3 文件存储。我运行了该collectstatic命令,效果很好,文件显示在 AWS 管理控制台中。但是,当在本地运行服务器时 ( runserver),所有静态文件都会丢失。查看控制台有错误消息

GET https://BUCKET.s3.eu-central-1.amazonaws.com/static/admin/css/nav_sidebar.css net::ERR_ABORTED 403 (Forbidden)
Run Code Online (Sandbox Code Playgroud)

对于每个文件。该网址对我来说看起来不错,上传工作正常,但显然访问不起作用。这和我在AWS中的配置有关系吗?或者这是 Django 设置问题?

设置文件如下所示:

STATICFILES_DIRS = []
AWS_ACCESS_KEY_ID = 'XYZ'
AWS_SECRET_ACCESS_KEY = 'XYZ'
AWS_STORAGE_BUCKET_NAME = 'BUCKET'
AWS_S3_CUSTOM_DOMAIN = '%s.s3.amazonaws.com' % AWS_STORAGE_BUCKET_NAME

AWS_S3_OBJECT_PARAMETERS = {
    'CacheControl': 'max-age=86400',
}

AWS_STATIC_LOCATION = 'static'
STATICFILES_STORAGE = 'hq.storage_backends.StaticStorage'
STATIC_URL = "https://%s/%s/" % (AWS_S3_CUSTOM_DOMAIN, AWS_STATIC_LOCATION)

AWS_MEDIA_LOCATION = 'media'
DEFAULT_FILE_STORAGE = 'hq.storage_backends.MediaStorage'

Run Code Online (Sandbox Code Playgroud)

iho*_*yam 7

确保存储桶策略是公开的(并且文件可以公开访问),如果是,您可以尝试运行 runserver --insecure,不要在生产中使用它,但显然如果文件不可公开访问,您可以尝试设置并运行AWS_DEFAULT_ACL='public-read'收集再次静态以使其公开

我建议使用环境来更改此设置,例如

import environ

...

AWS_DEFAULT_ACL = env('AWS_DEFAULT_ACL')
Run Code Online (Sandbox Code Playgroud)

在您的 settings.py 中或将设置存储到 s3 存储桶的任何位置,并使用环境变量根据需要更改它

因此,在安装和设置之后,environ您可以轻松地使用环境变量进行更改,只需将其 设置AWS_DEFAULT_ACLpublic-readexport AWS_DEFAULT_ACL=public-read