11

私は django-storages と sorl_thumbnail を一緒に使用しており、静的ファイルとメディア ファイルには Amazon S3 を使用しています。私は 2 つのフォルダを持つ 1 つのバケットを使用しています。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'

MediaRootS3BotoStorageでありStaticRootS3BotoStorage、次のように定義されています。

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

私が sorl_thumbnail を使用している場合、生成されたサムネイルは正しいディレクトリにありhttps://s3.amazonaws.com/my-bucket/media/cacheます。https://s3.amazonaws.com/my-bucket/cachemedia

どうすればそれを修正できるか分かりますか?

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/jamstooks/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 テーブルの「ストレージ」値が間違っていました。このラムダ定義は新しいクラスを作成しないため、type(StaticRootS3BotoStorage()) は「storages.backends.s3boto.S3BotoStorage」を返し、これがテーブルに書き込まれます。これらの「ストレージ」値は、表示時に画像 URL を取得するために後でストレージをインスタンス化するために使用されるため、これに S3BotoStorage() が使用されることになりました。したがって、「場所」引数は失われました。

これらのカスタム ストレージをクラスとして定義する Salma Hamed によるソリューションは、これを修正します。

ありがとうございます!

于 2013-05-23T15:45:17.587 に答える
1

私はこれとまったく同じ問題を抱えていましたが、それを回避する方法を見つけました。

見逃さないように、そのようにDEFAULT_FILE_STORAGE背中をに設定し、すべてのファイルをにアップロードすることができました。storages.backends.s3boto.S3BotoStoragecache/media/python manage.py collectstaticStaticRootS3BotoStorage = lambda: S3BotoStorage(location='static')

この問題が私を夢中にさせていたので、これがあなたを助けてくれることを願っています.

于 2012-10-13T04:17:36.717 に答える
1

THUMBNAIL_PREFIX を media/cache/ に設定してみましたか?

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

于 2012-10-05T17:58:33.283 に答える
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 に答える