Как сделать так, чтобы медиа-файлы автоматически отображались в django с использованием s3 в качестве хранилища? - PullRequest
1 голос
/ 15 февраля 2020

Я сконфигурировал свои настройки s3 следующим образом:

DEFAULT_FILE_STORAGE = 'Bonychicken.storage_backends.MediaStorage'
AWS_STORAGE_BUCKET_NAME = 'bonychicken'
AWS_S3_REGION_NAME = 'us-east-2'
AWS_ACCESS_KEY_ID = '<my access key id>'
AWS_SECRET_ACCESS_KEY = '<my secret access key>'
AWS_S3_CUSTOM_DOMAIN = f"{AWS_STORAGE_BUCKET_NAME}.s3.{AWS_S3_REGION_NAME}.amazonaws.com"
AWS_QUERYSTRING_AUTH = False
AWS_DEFAULT_ACL = None
STATIC_URL = '/static/'
MEDIAFILES_LOCATION = 'media'
MEDIA_URL = f"https://{AWS_S3_CUSTOM_DOMAIN}/media/"
MEDIA_ROOT = f"https://{AWS_S3_CUSTOM_DOMAIN}/media/"
AWS_IS_GZIPPED = True
AWS_S3_OBJECT_PARAMETERS = {
    'CacheControl': 'max-age=86400',
}

Мой класс хранения:

from storages.backends.s3boto3 import S3Boto3Storage

class MediaStorage(S3Boto3Storage):
    bucket_name = 'bonychicken'
    location = 'media'
    file_overwrite = False

Я добавил storages в мои установленные приложения, и boto3 также установлен .

CORS Конфигурация:

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
    <AllowedOrigin>*</AllowedOrigin>
    <AllowedMethod>GET</AllowedMethod>
    <MaxAgeSeconds>3000</MaxAgeSeconds>
    <AllowedHeader>Authorization</AllowedHeader>
</CORSRule>
</CORSConfiguration>

block public access выключен. IAM У пользователя есть права доступа к корзине.

Проблема в том, что всякий раз, когда я загружаю файл, он загружается в мою корзину s3, но не отображается на странице html. Попытка получить доступ к URL-адресу изображения из исходного кода приводит к:

<Error>
    <Code>AccessDenied</Code>
    <Message>Access Denied</Message>
    <RequestId><random letters here></RequestId>
    <HostId>
        <random letters here>
    </HostId>
</Error>

Но если я go в настройках своего контейнера и выберу actions и нажму make public после пометки файлов мультимедиа, все начинается за работой. Это означает, что для каждого загруженного изображения я должен отмечать и повторять снова и снова.

Как мне решить эту проблему?

1 Ответ

1 голос
/ 15 февраля 2020

Я думаю, что вы должны изменить ACL по умолчанию в настройках AWS, как показано в документах .

Просто установите AWS_DEFAULT_ACL на AWS_DEFAULT_ACL='public-read'.

...