Django + AWS s3 可以上传文件但不能访问它们
Django + AWS s3 can upload files but not access them
在 this tutorial 之后,我使用 boto3 和 Django-storages 将我们的系统设置为使用 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'
确保存储桶策略是 public(并且文件是 public只能访问),如果是,你可以尝试 运行 运行server --insecure , 不要在生产中使用它,但显然如果文件无法 public 访问,您可以尝试设置 AWS_DEFAULT_ACL='public-read'
和 运行 再次收集静态文件以使它们 public
我建议使用 environ 来更改此设置,例如
import environ
...
AWS_DEFAULT_ACL = env('AWS_DEFAULT_ACL')
在您的 settings.py 中或您将设置存储到 s3 存储桶的任何地方
并根据需要使用环境变量来改变它
因此,在安装和设置 environ
之后,您可以轻松更改使用环境变量,只需将 AWS_DEFAULT_ACL
设置为 public-read
喜欢 export AWS_DEFAULT_ACL=public-read
在 this tutorial 之后,我使用 boto3 和 Django-storages 将我们的系统设置为使用 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'
确保存储桶策略是 public(并且文件是 public只能访问),如果是,你可以尝试 运行 运行server --insecure , 不要在生产中使用它,但显然如果文件无法 public 访问,您可以尝试设置 AWS_DEFAULT_ACL='public-read'
和 运行 再次收集静态文件以使它们 public
我建议使用 environ 来更改此设置,例如
import environ
...
AWS_DEFAULT_ACL = env('AWS_DEFAULT_ACL')
在您的 settings.py 中或您将设置存储到 s3 存储桶的任何地方 并根据需要使用环境变量来改变它
因此,在安装和设置 environ
之后,您可以轻松更改使用环境变量,只需将 AWS_DEFAULT_ACL
设置为 public-read
喜欢 export AWS_DEFAULT_ACL=public-read