我创建了一个数字海洋存储空间。空间的url如下
https://storagespace.nyc3.digitaloceanspaces.com
但是,当我单击 url 在浏览器上打开时,出现以下错误:
<Error>
<Code>AccessDenied</Code>
<BucketName>storagespace</BucketName>
<RequestId>tx000000000000001618a5e-0081246af3-1805687a-nyc3c</RequestId>
<HostId>1805987a-nyc3c-nyc3-zg03</HostId>
</Error>
我不知道这个错误是什么意思,也不知道为什么会出现这个错误。我将 s3 存储桶与我的 django 网站连接起来,静态文件也没有提供给浏览器,而是收到 403 禁止错误。请问如何删除这个
access denied
错误?
tl;dr 按照他们的官方教程:https://www.digitalocean.com/community/tutorials/how-to-set-up-a-scalable-django-app-with-digitalocean-management-databases-and-空格
不幸的是,我们并不真正知道您正在使用什么包(比如您是否使用 Django-storages 将这些静态文件获取到 S3?)。我没有数字海洋的经验,但这里有一些可以尝试的事情:
正如您在教程中看到的,他们有这些设置,我认为数字海洋已经为您提供了:
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/2.1/howto/static-files/
# Moving static assets to DigitalOcean Spaces as per:
# https://www.digitalocean.com/community/tutorials/how-to-set-up-object-storage-with-django
AWS_ACCESS_KEY_ID = 'your_spaces_access_key'
AWS_SECRET_ACCESS_KEY = 'your_spaces_secret_key'
AWS_STORAGE_BUCKET_NAME = 'your_space_name'
AWS_S3_ENDPOINT_URL = 'spaces_endpoint_URL'
AWS_S3_CUSTOM_DOMAIN = 'spaces_edge_endpoint_URL'
AWS_S3_OBJECT_PARAMETERS = {
'CacheControl': 'max-age=86400',
}
AWS_LOCATION = 'static'
AWS_DEFAULT_ACL = 'public-read'
STATICFILES_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
STATIC_URL = '{}/{}/'.format(AWS_S3_CUSTOM_DOMAIN, AWS_LOCATION)
STATIC_ROOT = 'static/'
问题是,当您运行
AWS_DEFAULT_ACL = 'public-read'
时,您的 settings.py
中缺少 python manage.py collectstatic
。 现在,您需要返回并将所有抛出 403 Forbidden
错误的文件的权限手动设置为 public-read
。 我建议还将 AWS_DEFAULT_ACL = 'public-read'
添加到您的设置中,以便将来使用 collectstatic
命令。
简单来说,添加到数字海洋空间的项目默认设置为私有。为了解决这个问题,您最好将它们指定为可公开访问,以便从浏览器中查看它们,而不会出现 403 错误。
由于某些项目可能已经上传,指示为“管理权限”的文件旁边的配置将允许您将这些项目切换为公开。否则可以这样做:(我现在将给出一个 Rails 实现,当我可以的时候就用Python)
注意“公开宣读”法令。
还值得一提的是:端点是
https://<data-center-region>.digitaloceanspaces.com
,对于您的情况,这应该是:https://nyc3.digitaloceanspaces.com
,而存储桶是 storagespace
。