Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

django-storages + sorl_thumbnail + S3 not working well together (URLs mismatch)

I am using django-storages and sorl_thumbnail together and I am using Amazon S3 for static and media files. I am using one bucket with 2 folders, 1 for static and 1 for media.

Here is my config:

MEDIA_ROOT = '/media/'
MEDIA_URL = 'https://s3.amazonaws.com/my-bucket/media/'
STATIC_ROOT = '/static/'
STATIC_URL = 'https://s3.amazonaws.com/my-bucket/static/'
AWS_STORAGE_BUCKET_NAME = 'my-bucket'
DEFAULT_FILE_STORAGE = 'my_lib.s3utils.MediaRootS3BotoStorage'
STATICFILES_STORAGE = 'my_lib.s3utils.StaticRootS3BotoStorage'

MediaRootS3BotoStorage and StaticRootS3BotoStorage are defined like this:

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

When I am using sorl_thumbnail, the thumbnails generated are located in the right directory: https://s3.amazonaws.com/my-bucket/media/cache but when sorl_thumbnail is trying to retrieve an already existing thumbnail, the URL generated is: https://s3.amazonaws.com/my-bucket/cache, you will notice that the media folder is omitted.

Do you have any idea how I could fix that?

I know I could just use django-storages and have my static and media files all mixed up in my bucket, but that's a bit too dirty for my taste :)

Thank you!

like image 250
e-Jah Avatar asked Sep 30 '12 07:09

e-Jah


1 Answers

I was able to make it work by defining MediaRootS3BotoStorage and StaticRootS3BotoStorage as follows:

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

class StaticRootS3BotoStorage(S3BotoStorage):
    """
    Storage for static files.
    """

    def __init__(self, *args, **kwargs):
        kwargs['location'] = 'static'
        super(StaticRootS3BotoStorage, self).__init__(*args, **kwargs)


class MediaRootS3BotoStorage(S3BotoStorage):
    """
    Storage for uploaded media files.
    """

    def __init__(self, *args, **kwargs):
        kwargs['location'] = 'media'
        super(MediaRootS3BotoStorage, self).__init__(*args, **kwargs)

This link can be helpful https://github.com/jamstooks/django-s3-folder-storage

like image 150
Salma Hamed Avatar answered Oct 21 '22 07:10

Salma Hamed