Приложение 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'