Я следовал руководству: 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 не позволяет мне (?!).Я не думал, что это будет иметь значение, так как я ввожу здесь свои учетные данные, которые, как я думал, будут отправлены в качестве заголовков, чтобы дать мне доступ.