Подтвердить что ты не робот

Использование Cloudfront с Django S3Boto

Я успешно настроил мое приложение, чтобы использовать S3 для хранения всех статических и мультимедийных файлов. Тем не менее, я хотел бы загрузить на S3 (текущая операция), но использовать из экземпляра cloudfront, который я настроил. Я попытался настроить настройки на url облака, но он не работает. Как я могу загрузить на S3 и служить из Cloudfront, пожалуйста?

Настройки

AWS_S3_CUSTOM_DOMAIN = '%s.s3.amazonaws.com' % AWS_STORAGE_BUCKET_NAME

DEFAULT_FILE_STORAGE = 'app.custom_storages.MediaStorage'
STATICFILES_STORAGE = 'app.custom_storages.StaticStorage'

STATICFILES_LOCATION = 'static'
MEDIAFILES_LOCATION = 'media'

STATIC_URL = "https://s3-eu-west-1.amazonaws.com/app/%s/" % (STATICFILES_LOCATION)
MEDIA_URL = "https://%s/%s/" % (AWS_S3_CUSTOM_DOMAIN, MEDIAFILES_LOCATION)

custom_storages.py

from django.conf import settings
from storages.backends.s3boto import S3BotoStorage

class StaticStorage(S3BotoStorage):
    location = settings.STATICFILES_LOCATION

class MediaStorage(S3BotoStorage):
    location = settings.MEDIAFILES_LOCATION
4b9b3361

Ответ 1

Ваш код почти завершен, за исключением того, что вы не добавляете облачный домен в STATIC_URL/MEDIA_URL и свои пользовательские хранилища.

В деталях вы должны сначала установить зависимости

pip install django-storages-redux boto

Добавьте необходимые настройки в файл настроек django

INSTALLED_APPS = (
    ...
    'storages',
    ...
)

AWS_STORAGE_BUCKET_NAME = 'mybucketname'
AWS_CLOUDFRONT_DOMAIN = 'xxxxxxxx.cloudfront.net'
AWS_ACCESS_KEY_ID = get_secret("AWS_ACCESS_KEY_ID")
AWS_SECRET_ACCESS_KEY = get_secret("AWS_SECRET_ACCESS_KEY")

MEDIAFILES_LOCATION = 'media'
MEDIA_ROOT = '/%s/' % MEDIAFILES_LOCATION
MEDIA_URL = '//%s/%s/' % (AWS_CLOUDFRONT_DOMAIN, MEDIAFILES_LOCATION)
DEFAULT_FILE_STORAGE = 'app.custom_storages.MediaStorage'

STATICFILES_LOCATION = 'static'
STATIC_ROOT = '/%s/' % STATICFILES_LOCATION
STATIC_URL = '//%s/%s/' % (AWS_CLOUDFRONT_DOMAIN, STATICFILES_LOCATION)
STATICFILES_STORAGE = 'app.custom_storages.StaticStorage'

Ваши пользовательские хранилища нуждаются в некоторой модификации, чтобы представить облачный домен для ресурсов вместо домена S3:

from django.conf import settings
from storages.backends.s3boto import S3BotoStorage

class StaticStorage(S3BotoStorage):
"""uploads to 'mybucket/static/', serves from 'cloudfront.net/static/'"""
    location = settings.STATICFILES_LOCATION

    def __init__(self, *args, **kwargs):
        kwargs['custom_domain'] = settings.AWS_CLOUDFRONT_DOMAIN
        super(StaticStorage, self).__init__(*args, **kwargs)

class MediaStorage(S3BotoStorage):
"""uploads to 'mybucket/media/', serves from 'cloudfront.net/media/'"""
    location = settings.MEDIAFILES_LOCATION

    def __init__(self, *args, **kwargs):
        kwargs['custom_domain'] = settings.AWS_CLOUDFRONT_DOMAIN
        super(MediaStorage, self).__init__(*args, **kwargs)

И это все, что вам нужно, если ваш ведро и облачный домен правильно связаны, и пользователь AWS_ACCESS_KEY имеет права доступа к вашему ведру. Кроме того, в зависимости от вашего варианта использования, вы можете захотеть сделать ваши элементы ведра s3 доступными только для чтения.

Ответ 2

У меня была аналогичная проблема, и настройка AWS_S3_CUSTOM_DOMAIN на URL-адрес Cloudfront в Django settings.py работала для меня. Вы можете проверить код здесь.