django-storages + sorl_thumbnail + S3不能很好地协同工作(URL不匹配)

e-J*_*Jah 9 django amazon-s3 boto sorl-thumbnail django-storage

我正在使用django-storage和sorl_thumbnail,我正在使用Amazon S3来获取静态和媒体文件.我使用一个带2个文件夹的存储桶,1个用于静态,1个用于媒体.

这是我的配置:

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'
Run Code Online (Sandbox Code Playgroud)

MediaRootS3BotoStorageStaticRootS3BotoStorage定义如下:

StaticRootS3BotoStorage = lambda: S3BotoStorage(location='static')
MediaRootS3BotoStorage = lambda: S3BotoStorage(location='media')
Run Code Online (Sandbox Code Playgroud)

当我使用sorl_thumbnail时,生成的缩略图位于右侧目录中:https://s3.amazonaws.com/my-bucket/media/cache但是当sorl_thumbnail尝试检索已存在的缩略图时,生成的URL为:https://s3.amazonaws.com/my-bucket/cache,您会注意到该media文件夹被省略.

你知道我怎么能解决这个问题吗?

我知道我可以使用django-storages并将我的静态和媒体文件全部混合在我的桶中,但这对我来说有点太脏了:)

谢谢!

Sal*_*med 17

我能够通过定义MediaRootS3BotoStorageStaticRootS3BotoStorage使其工作,如下所示:

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)
Run Code Online (Sandbox Code Playgroud)

这个链接可以提供帮助https://github.com/jamstooks/django-s3-folder-storage


小智 8

我遇到了同样的问题,Salma Hamed的解决方案对我来说是最合适的.

在我们之前

StaticRootS3BotoStorage = lambda: S3BotoStorage(location='static')
MediaRootS3BotoStorage = lambda: S3BotoStorage(location='media')
Run Code Online (Sandbox Code Playgroud)

这导致我们的thumbnail_kvstore表中存在错误的"存储"值.此lambda定义不会创建新类,因此类型(StaticRootS3BotoStorage())返回写入表中的"storages.backends.s3boto.S3BotoStorage".因为这些"存储"值用于稍后实例化存储以便在显示时获取图像URL,所以这导致使用S3BotoStorage().所以'位置'论点丢失了.

Salma Hamed的解决方案将这些自定义存储定义为类可以解决这个问题.

感谢那!