Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 无法查看aws s3上的文件(禁止403)_Python_Django_Amazon S3_Boto3 - Fatal编程技术网

Python 无法查看aws s3上的文件(禁止403)

Python 无法查看aws s3上的文件(禁止403),python,django,amazon-s3,boto3,Python,Django,Amazon S3,Boto3,我可以使用django存储和boto3上传到AWS S3,但无法查看(403禁止) 我遵循指南: 我已经成功地设置了bucket并将静态文件传输到AmazonS3 然而,当我尝试加载S3文件时,我收到一条403禁止消息 以下是my settings.py文件中的内容: # AWS s3 (image storage) AWS_ACCESS_KEY_ID = 'XXX' # XXX replaced with the actual key AWS_SECRET_ACCESS_KEY = 'YYY

我可以使用
django存储
boto3
上传到AWS S3,但无法查看(403禁止)

我遵循指南:

我已经成功地设置了bucket并将静态文件传输到AmazonS3

然而,当我尝试加载S3文件时,我收到一条403禁止消息

以下是my settings.py文件中的内容:

# AWS s3 (image storage)

AWS_ACCESS_KEY_ID = 'XXX' # XXX replaced with the actual key
AWS_SECRET_ACCESS_KEY = 'YYY' # YYY replaced with the actual key

# sensitive data will be replaced with environment variables when page is public

AWS_STORAGE_BUCKET_NAME = 'diceart-static'
AWS_S3_CUSTOM_DOMAIN = 's3.eu-west-2.amazonaws.com/%s' % AWS_STORAGE_BUCKET_NAME
AWS_S3_OBJECT_PARAMETERS = {
'CacheControl': 'max-age=86400',
}
AWS_LOCATION = 'static'
AWS_DEFAULT_ACL = None
AWS_BUCKET_ACL = None

AWS_QUERYSTRING_AUTH = False

STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static'),
]

STATIC_URL = 'https://%s/%s/' % (AWS_S3_CUSTOM_DOMAIN, AWS_LOCATION)

STATICFILES_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'

DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
所以当我跑的时候

python manage.py collectstatic
一切都成功了!我可以看到我上传到AmazonS3的所有文件。我还可以看到这个程序访问的时间,所以我知道这一切都起作用了

以下是我希望提供S3文件的html模板文件的内容:

{% extends 'dice/base.html' %}
{% load crispy_forms_tags %}
{% load static %}

{% block content %}
  <form method="post" enctype="multipart/form-data">
    {% csrf_token %}
    {{ form|crispy }}
    {% if not uploaded_file_url %}
        <button type="submit" class="btn btn-success mt-2">Upload</button>
    {% endif %}
  </form>

  {% if uploaded_file_url %}
    <p>File uploaded at: <a href="{{ uploaded_file_url }}">{{ uploaded_file_url }}</a></p>
    <img src="{{ uploaded_file_url }}">
  {% endif %}

  <p><a href="{% url 'index' %}">Return to home</a></p>
  <p>Have a picture of a cat:</p>
  <p><img src="{% static 'cat.jpg' %}"></p>
{% endblock %}
但我得到一个403禁止错误和没有图像加载

以下是我在Chrome开发者工具网络标题中看到的内容:

Request URL: https://s3.eu-west-2.amazonaws.com/diceart-static/static/cat.jpg
Request Method: GET
Status Code: 403 Forbidden
Remote Address: 52.95.148.64:443
Referrer Policy: no-referrer-when-downgrade
Provisional headers are shown
Referer: https://mysubdomain.pythonanywhere.com/upload2/
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 
(KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36
referer是加载图像的页面,托管在pythonywhere上

现在我不确定的是我的S3存储桶的url。我在网上查到的每个地方似乎都有这样的结构

https://diceart-static.s3.amazonaws.com
而不是我所拥有的:

https://s3.eu-west-2.amazonaws.com/diceart-static
我认为这可能只是对AWS的url结构的一个改变,而不是我上传时遇到的问题,但也许值得一提

所以基本上我可以通过编程上传,但我不能使用django存储和boto3查看我的S3文件。我错过了什么


请注意,bucket不允许公共访问,但我无法更改,因为Amazon不允许我访问(?)。我不认为这有什么关系,因为我在这里输入了我的凭证,我认为这些凭证会作为标题发送给我访问权限。

从上面的设置AWS\u DEFAULT\u ACL被设置为None,并且 警察说

如果设置为None,则所有文件都将继承bucket的ACL

S3的默认ACL为private

您可以按照建议设置
AWS\u DEFAULT\u ACL=None
,然后通过继承
s3boto3存储来编写自己的存储类:

#myapp/myfilestorage.py

from storages.backends.s3boto3 import S3Boto3Storage
from django.conf import settings

class StaticS3Storage(S3Boto3Storage):
   location = settings.AWS_STATIC_LOCATION
   default_acl = 'public-read'
然后您可以在您的设置中使用此选项:

AWS_STATIC_LOCATION = 'static'

STATICFILES_STORAGE = 'myapp.myfilestorage.StaticS3Storage'

您也可以根据具体情况对其进行编辑/复制以用于默认文件存储

我认为这篇文章已经过时,因此有点误导
django存储
docs不是很好,但是通过一些尝试和错误,我认为您实际需要的设置是:

AWS\u访问\u密钥\u ID=''
AWS_SECRET_ACCESS_KEY=''
AWS\存储\存储桶\名称='Dicert static'
AWS_S3_地区_名称='eu-west-2'
AWS\u默认值\u ACL=无
AWS_S3_对象_参数={
'CacheControl':'max age=86400',
}
AWS_位置='静态'
静态文件\u目录=[
join(BASE_DIR,'static'),
]
STATICFILES_STORAGE='storages.backends.s3boto3.s3boto3存储'
默认文件存储='storages.backends.s3boto3.s3boto3存储'
注意,我已经从设置中删除了
AWS\u S3\u自定义\u域
STATIC\u URL
。这些将由
django storages
自动为您构建

通过这些设置,您应该仍然能够将bucket权限保留为不可供public使用,并且它应该仍然可以工作,因为它使用querystring auth


编辑 虽然上述方法应该有效,但我不确定这是否是公共web应用程序的“最佳实践”。如果您能够取消选中
阻止所有公共访问
框并将其关闭,则可以使用这些设置,并且不会使用(或不需要)querystring auth

#。。。同上
#使默认ACL公开可读
AWS_DEFAULT_ACL='公共读取'
#关闭查询验证,尽管不确定是否需要。
AWS\u QUERYSTRING\u AUTH=False
# ... 同上

是,您可以通过转到的“权限”选项卡将s3存储桶公开bucket@VaibhavVishal它不会让我更改为公共,因为它说“访问被拒绝”。我也不想让它公开。我的问题是试图从公共URL加载图像吗?我不明白为什么它不使用我的密钥访问文件。它在上载文件时使用密钥和id,访问文件与
django存储
boto3
无关,只是django试图加载一些文件,它希望url是公共的,如果静态文件不能公开使用,您的网站将如何公开工作。如果您无法更改bucket的权限,可能是因为您的IAM角色没有足够的权限,您可以尝试使用root用户,或者为IAM授予更多权限role@VaibhavVishal谢谢你,我不知道私人档案是怎么运作的。我可以看到我遵循的指南的默认设置是public,但我的是private。我在这里找到了一个指南,希望它能让我访问私人URL,如果我能做到,我会向你汇报。我快要发疯了,你的回答和我合作得很好!此外,它还适用于使用相同的方法添加其他自定义私有和公共媒体存储类。谢谢
https://s3.eu-west-2.amazonaws.com/diceart-static
#myapp/myfilestorage.py

from storages.backends.s3boto3 import S3Boto3Storage
from django.conf import settings

class StaticS3Storage(S3Boto3Storage):
   location = settings.AWS_STATIC_LOCATION
   default_acl = 'public-read'
AWS_STATIC_LOCATION = 'static'

STATICFILES_STORAGE = 'myapp.myfilestorage.StaticS3Storage'