1. ホーム
  2. python

[解決済み] Django プロジェクトで django-storages と Amazon S3 を使用し、静的ファイルとメディアファイル用に異なるフォルダを設定するにはどうしたらいいですか?

2023-02-09 12:53:47

質問

私は、アプリの静的ファイルを保存するためにサーバーファイルシステムを使用していた Django プロジェクトを設定しています ( STATIC_ROOT ) とユーザがアップロードしたファイル ( MEDIA_ROOT ).

私は今、すべてのコンテンツをAmazonのS3にホスティングする必要があるので、このためにバケットを作成しました。使用方法 django-storages と共に boto のストレージバックエンドで、収集した静的情報をS3バケットにアップロードすることに成功しました。

MEDIA_ROOT = '/media/'
STATIC_ROOT = '/static/'

DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3BotoStorage'
AWS_ACCESS_KEY_ID = 'KEY_ID...'
AWS_SECRET_ACCESS_KEY = 'ACCESS_KEY...'
AWS_STORAGE_BUCKET_NAME = 'bucket-name'
STATICFILES_STORAGE = 'storages.backends.s3boto.S3BotoStorage'

すると、問題が発生しました。 MEDIA_ROOTSTATIC_ROOT はバケット内では使用されないため、バケットルートには静的ファイルとユーザーがアップロードしたパスの両方が含まれます。

となると、設定できるのは

S3_URL = 'http://s3.amazonaws.com/%s' % AWS_STORAGE_BUCKET_NAME
STATIC_URL = S3_URL + STATIC_ROOT
MEDIA_URL = 'S3_URL + MEDIA_ROOT

でS3に保存する場合、静的ファイル/メディアファイルの区別はありません。 django-storages .

これはどのようにしてできるのでしょうか?

ありがとうございます。

どのように解決するのですか?

似たような方法ですが、Mandxの方法よりもシンプルで、次のようにすればうまくいくと思います。

を作成します。 s3utils.py ファイルを作成します。

from storages.backends.s3boto import S3BotoStorage

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

次に settings.py :

DEFAULT_FILE_STORAGE = 'myproject.s3utils.MediaRootS3BotoStorage'
STATICFILES_STORAGE = 'myproject.s3utils.StaticRootS3BotoStorage'

異なるが関連した例(私が実際にテストしたもの)が、2つの example_ ファイル ここで .