Статические файлы Django через S3 - PullRequest
0 голосов
/ 25 августа 2018

Я пытался настроить S3 для обслуживания моих статических файлов. Файлы, кажется, находятся в ведре, и ссылки на файлы, кажется, проходят через OK в моих шаблонах, но файлы фактически не применяются. Когда я смотрю на инспектора моего браузера, я вижу теги скрипта, подобные этим

<script src="https://mybucket.s3.amazonaws.com/static/js/jquery.js?AWSAccessKeyId=REDACTED&amp;Signature=REDACTED&amp;Expires=00000000"></script>

Примечание: я изменил значения в ссылках на УДАЛЕНО и 00000000

Когда я иду на

https://mybucket.s3.amazonaws.com/static/js/jquery.js

Я действительно вижу код. Но когда я иду на

https://mybucket.s3.amazonaws.com/static/js/jquery.js?AWSAccessKeyId=REDACTED&amp;Signature=REDACTED&amp;Expires=00000000

Я получаю следующее сообщение

This XML file does not appear to have any style information associated with it. The document tree is shown below.
<Error>
  <Code>InvalidRequest</Code>
  <Message>
    The authorization mechanism you have provided is not supported. Please use AWS4-HMAC-SHA256.
  </Message>
  <RequestId>REDACTED</RequestId>
  <HostId>
    REDACTED
  </HostId>
</Error>

Редактировать: Согласно предложению Майкла Дж. Робертса, похоже, что проблема связана с подписью. Доки хранилищ django говорят, что вы должны добавить

S3_USE_SIGV4 = True

в settings.py. Я сделал это, но это не решает мою проблему. Возможно, я делаю это неправильно или некоторые другие мои настройки мешают работе?

Я создал папку aws внутри той же папки, что и настройки, в которой есть файл utils.py

from storages.backends.s3boto3 import S3Boto3Storage

StaticRootS3BotoStorage = lambda: S3Boto3Storage(location='static')
MediaRootS3BotoStorage  = lambda: S3Boto3Storage(location='media')

а потом в мои settings.py я ставлю

import datetime

AWS_ACCESS_KEY_ID = 'REDACTED'
AWS_SECRET_ACCESS_KEY = 'REDACTED'
AWS_FILE_EXPIRE = 200
S3_USE_SIGV4 = True
AWS_PRELOAD_METADATA = True
AWS_QUERYSTRING_AUTH = True

DEFAULT_FILE_STORAGE = 'MyProject.aws.utils.MediaRootS3BotoStorage'
STATICFILES_STORAGE = 'MyProject.aws.utils.StaticRootS3BotoStorage'
AWS_STORAGE_BUCKET_NAME = 'mybucket'
S3DIRECT_REGION = 'eu-central-1'
AWS_S3_HOST = 's3.eu-central-1.amazonaws.com'
S3_URL = '//%s.s3.amazonaws.com/' % AWS_STORAGE_BUCKET_NAME
MEDIA_URL = '//%s.s3.amazonaws.com/media/' % AWS_STORAGE_BUCKET_NAME
MEDIA_ROOT = MEDIA_URL
STATIC_URL = S3_URL + 'static/'
ADMIN_MEDIA_PREFIX = STATIC_URL + 'admin/'

two_months = datetime.timedelta(days=61)
date_two_months_later = datetime.date.today() + two_months
expires = date_two_months_later.strftime("%A, %d %B %Y 20:00:00 GMT")

AWS_HEADERS = { 
    'Expires': expires,
    'Cache-Control': 'max-age=%d' % (int(two_months.total_seconds()), ),
}

Здесь что-то не так?

Может ли это быть связано с тем, что я еще не настроил свой проект для SSL? Или это действительно вещь AWS.

В моих журналах при загрузке страницы написано "Расчет подписи с использованием аутентификации hmacv1". Эта версия должна быть v4? Или это ничего не говорит?

...