Может загружать в AWS S3, используя django-хранилища и boto3, но не может просматривать (403 запрещено), не может понять, почему - PullRequest
0 голосов
/ 11 февраля 2019

Я следовал руководству: https://simpleisbetterthancomplex.com/tutorial/2017/08/01/how-to-setup-amazon-s3-in-a-django-project.html

И я успешно настроил корзины и перенес статические файлы в Amazon S3.

Однако, когда я пытаюсь загрузить файлы S3,Я получаю сообщение 403 Запрещено.

Вот что находится в моем файле 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

Все работало!И я мог видеть все мои файлы, загруженные в Amazon S3.Я также могу видеть время программного доступа к этому, так что я знаю, что все это работает.

Вот содержимое моего html-файла шаблона, где я надеюсь обслуживать файлы S3:

{% 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 %}

Ключевым битом здесь является предпоследняя строка:

<p><img src="{% static 'cat.jpg' %}"></p>

Приведенный выше код относится к загрузке пользовательских файлов, которую я пока не использую с помощью S3.

Сейчаскогда страница загружается, она делает это без ошибок, и соответствующая строка выглядит следующим образом:

<img src="https://s3.eu-west-2.amazonaws.com/diceart-static/static/cat.jpg">

И, проверяя это по моей корзине S3, она выглядит так:

https://s3.eu-west-2.amazonaws.com/diceart-static/static/cat.jpg

Но я получаюa 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

Реферер - это страница, которая загружает изображение, размещенное наPythonanywhere.

Теперь кое-что, в чем я не уверен, - это URL моего S3-контейнера.Везде, где я проверяю онлайн, похоже, структура

https://diceart-static.s3.amazonaws.com

, а не то, что у меня есть:

https://s3.eu-west-2.amazonaws.com/diceart-static

Я думаю, что это может быть просто изменение структуры URL AWS, а не проблема здесьтак как мои загрузки работали, но, возможно, стоит упомянуть.

По сути, я могу загружать программно, но я не могу просматривать свои файлы S3, используя django-хранилища и boto3.Что мне здесь не хватает?

Обратите внимание, что для корзины нет общего доступа, но я не могу изменить это, потому что Amazon не позволяет мне (?!).Я не думал, что это будет иметь значение, так как я ввожу здесь свои учетные данные, которые, как я думал, будут отправлены в качестве заголовков, чтобы дать мне доступ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...