Приложение Django не загружает изображения из мультимедийной папки корзины AWS

Я использую django-oscarи хотел обслуживать мои статические файлы с помощью AWS S3. Чтобы настроить мой s3 bucket, я создал модуль под названием aws с conf.py а также utils.py файлы.

На моем веб-сайте, когда я загружаю изображение в продукт, оно хорошо загружается с правильным путем к моей корзине aws s3, но затем через очень короткое время путь меняется с https://mybucketname.s3.amazonaws.com/media/cache/..../image.jpg в https://mybucketname.s3.amazonaws.com/cache/..../image.jpg

Изображения находятся в media папка в моем ведре.

Я размещаю свое веб-приложение на heroku, статические файлы обслуживаются правильно, но проблема возникает в медиа-папке.

Вот мой код -

файл utils.py

from storages.backends.s3boto3 import S3Boto3Storage

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

как static а также media находятся папки на моем ведре s3

conf.py

import datetime

AWS_ACCESS_KEY_ID = "xxx"
AWS_SECRET_ACCESS_KEY = "yyy"

AWS_PRELOAD_METADATA = True
AWS_QUERYSTRING_AUTH = False
AWS_DEFAULT_ACL = None 

DEFAULT_FILE_STORAGE = 
'myproject.aws.utils.MediaRootS3BotoStorage'
STATICFILES_STORAGE = 
'myproject.aws.utils.StaticRootS3BotoStorage'
AWS_STORAGE_BUCKET_NAME = 'mybucket-name'
S3DIRECT_REGION = 'us-east-2'
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()), ),
}

и мои settings.py я добавил это

from myproject.aws.conf import *

Что я должен сделать, чтобы решить эту проблему?

1 ответ

Решение

Система хранения файлов, настроенная для вашего приложения Django, должна быть классом, который реализует django.core.files.storage.Storage [1]

storages.backends.s3boto3.S3Boto3Storage уже реализует этот интерфейс хранения. [2]

настройка StaticRootS3BotoStorage в utils.py к lambda, Storage система создается лениво с надлежащим location значение; но location Атрибут в самом классе хранения никогда не меняется. [3]

location = setting('AWS_LOCATION', '')

Django очищает свойства экземпляра хранилища при изменении настроек проекта. [4] Так что когда location атрибут разрешается в системе хранения, он эффективно ищет атрибут класса один (location значение показано в приведенном выше фрагменте), потому что location атрибут отсутствует в экземпляре.

Эта ситуация может быть решена путем создания подклассов storages.backends.s3boto3.S3Boto3Storage вместо. Это гарантирует, что location значение никогда не меняется независимо от изменений в настройках проекта.

class StaticRootS3BotoStorage(S3Boto3Storage):
    location = 'static'

class MediaRootS3BotoStorage(S3Boto3Storage):
    location = 'media'
Другие вопросы по тегам