Приложение Django не загружает изображения из мультимедийной папки корзины AWS - PullRequest
0 голосов
/ 21 декабря 2018

Я использую django-oscar и хотел обслуживать мои статические файлы с помощью AWS S3.Чтобы сконфигурировать мое ведро s3, я создал модуль под названием 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 в моей корзине.

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

Вот мой код -

utils.py file

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 Ответ

0 голосов
/ 30 декабря 2018

Система хранения файлов, сконфигурированная для вашего приложения 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'
...