11

我将 django-storages 和 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'

MediaRootS3BotoStorageStaticRootS3BotoStorage定义如下:

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

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

你知道我该如何解决吗?

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

谢谢!

4

6 回答 6

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)

此链接可能会有所帮助https://github.com/jamstoks/django-s3-folder-storage

于 2012-11-10T10:49:01.860 回答
8

我遇到了同样的问题,Salma Hamed 的解决方案对我来说是正确的。

在我们有之前

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

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

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

感谢那!

于 2013-05-23T15:45:17.587 回答
1

您是否尝试将 THUMBNAIL_PREFIX 设置为 media/cache/?

http://sorl-thumbnail.readthedocs.org/en/latest/reference/settings.html#thumbnail-prefix

于 2012-10-05T17:58:33.283 回答
1

我遇到了同样的问题,但我想出了一个解决方法。

我将我的DEFAULT_FILE_STORAGE背部设置为storages.backends.s3boto.S3BotoStorage,这样,当它查找时cache/它不会丢失,我仍然可以将我的所有文件上传到media/,并且python manage.py collectstatic仍然可以正常工作,因为我仍然将那个设置为StaticRootS3BotoStorage = lambda: S3BotoStorage(location='static').

希望这对您有所帮助,因为这个问题让我发疯了。

于 2012-10-13T04:17:36.717 回答
0

发现正在使用(在创建初始缩略图后的下一个请求中sorl-thumbnail)返回缓存的KV图像。看起来没有任何影响。urlSTATIC_URLMEDIA_URL

不是最好的解决方案。添加了S3路由规则。

<RoutingRules>
  <RoutingRule>
    <Condition>
      <KeyPrefixEquals>cache/</KeyPrefixEquals>
    </Condition>
    <Redirect>
      <ReplaceKeyPrefixWith>media/cache/</ReplaceKeyPrefixWith>
    </Redirect>
  </RoutingRule>
</RoutingRules>
于 2013-01-27T08:25:21.037 回答
0

IDK 为什么但@SalmaHamed 的解决方案对我不起作用(可能是因为 django 版本的变化或其他原因)。相反,我将:替换MediaRootS3BotoStorage = lambda: S3Boto3Storage(location='media')为: class MediaRootS3BotoStorage(S3Boto3Storage): location = 'media'

于 2020-07-13T06:11:41.113 回答