La aplicación Django no carga imágenes de la carpeta de medios de AWS bucket

Estoy usando django-oscar y quería servir mis archivos estáticos con AWS S3. Para configurar mi cubeta s3, he creado un módulo llamado aws con archivos conf.py y utils.py .

En mi sitio web, cuando subo una imagen al producto, se carga bien con la ruta correcta a mi cubo aws s3, pero luego, muy poco tiempo, la ruta cambia de https://mybucketname.s3.amazonaws.com/media/cache/..../image.jpg a https://mybucketname.s3.amazonaws.com/cache/..../image.jpg

Las imágenes están en la carpeta de media en mi cubo.

Estoy alojando mi aplicación web en heroku, los archivos estáticos se sirven correctamente pero el problema ocurre en la carpeta de medios.

Aquí está mi código –

    archivo utils.py

     from storages.backends.s3boto3 import S3Boto3Storage StaticRootS3BotoStorage = lambda: S3Boto3Storage(location='static') MediaRootS3BotoStorage = lambda: S3Boto3Storage(location='media') 

    como static y los media son las carpetas en mi cubo 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()), ), } 

    y mi settings.py agregué esto

     from myproject.aws.conf import * 

    ¿Qué debo hacer para resolver este problema?

    El sistema de almacenamiento de archivos configurado para su aplicación Django debe ser una clase que implemente django.core.files.storage.Storage [1]

    storages.backends.s3boto3.S3Boto3Storage ya implementa esta interfaz de almacenamiento. [2]

    Al establecer StaticRootS3BotoStorage en utils.py en un lambda , el sistema de Storage se crea de manera perezosa con el valor de location adecuado; pero el atributo de location en la clase de almacenamiento nunca cambia. [3]

     location = setting('AWS_LOCATION', '') 

    Django borra las propiedades de la instancia de almacenamiento cuando cambia la configuración del proyecto. [4] De modo que cuando el atributo de location se resuelve en el sistema de almacenamiento, busca efectivamente el atributo de clase uno (el valor de location se muestra en el fragmento de código anterior) porque falta el atributo de location en la instancia.

    Esta situación puede resolverse subclasificando storages.backends.s3boto3.S3Boto3Storage lugar. Esto garantiza que el valor de la location nunca cambia, independientemente de los cambios en la configuración del proyecto.

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