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



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

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

对于每个文件。url在我看来是正确的,上传很好,但显然访问不起作用。这与我在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'

确保bucket策略是公共的(并且文件是可公开访问的(,如果是这样,你可能会尝试运行runserver——不安全,不要在生产中使用它,尽管很明显,如果文件不是可公开访问,你可以试着设置AWS_DEFAULT_ACL='public-read'并再次运行collect-static以使其公开

我建议使用environ来更改这个设置,比如

import environ
...
AWS_DEFAULT_ACL = env('AWS_DEFAULT_ACL')

在您的settings.py中,或者您将设置存储到s3 bucket的任何位置并使用env-vars在需要时更改

因此,在安装和设置environ之后,您可以通过简单地将AWS_DEFAULT_ACL设置为public-read来轻松地更改环境变量如export AWS_DEFAULT_ACL=public-read

相关内容

最新更新