29

私は AWS を使用しており、アプリケーションに異なるバケットを用意します。Django-Storages も使用しています。ファイルをアップロードするバケットを指定する方法はありますか (たとえば、Save() 関数のパラメーターなどとして)。

このDjango - Error importing storages.backendsを見ましたが、どのように使用すべきかわかりません?!

4

4 に答える 4

30

S3BotoStorageバケット名をパラメータとして受け取ります。指定しない場合は、AWS_STORAGE_BUCKET_NAME設定を使用します。つまりS3BotoStorage、デフォルトのストレージバックエンドを作成する場合DEFAULT_FILE_STORAGEは、デフォルトのバケットを使用する必要があります。

ただし、フィールドレベルでストレージを割り当てることもできます。

from django.db import models
from storages.backends.s3boto import S3BotoStorage

class MyModel(models.Model):
    file_1 = models.FileField() # Uses default storage
    file_2 = models.FileField(storage=S3BotoStorage(bucket='other-bucket'))

編集

コメントが手に負えなくなっているので、答えを更新します。インスタンスベースでストレージバックエンドのパラメーターを変更することは、DjangoストレージAPIが行うように設計されたものではありません。ストレージは静的ファイルなどのモデルのコンテキスト外で使用できるため、ストレージバックエンドにはモデルインスタンスの知識がありません。完全に不合理ではありませんが、Djangoまたはdjango-storagesが解決することを目的とした使用法ではありません。私はあなたがあなたのためにこれを処理するストレージバックエンドのドロップを見つけることはないと思います。

ドキュメントでは、ファイルを手動で管理する方法について説明しています。https ://docs.djangoproject.com/en/1.9/topics/files/#storage-objects少なくとも、ファイルを保存した場所にバケットを保存して、ファイルをどこかに保存する必要があります。後でモデルをクエリするときに見つけることができます。

于 2012-05-02T18:30:39.777 に答える
11

ランタイムでバケットを指定する場合の別の解決策として、モデルで save() メソッドを呼び出す前に指定できます。

上記の例に従ってください:

from django.db import models
from storages.backends.s3boto import S3BotoStorage

class MyModel(models.Model):
    file_1 = models.FileField() # Uses default storage
    file_2 = models.FileField()

モデルを保存するときのビューで、そのフィールドのストレージを指定できます。

my_file_model = MyModel()
my_file_model.file_2.storage = S3BotoStorage(bucket="your-bucket-name")
my_file_model.save()

このようにして、file_2 は指定したバケットに保存され、file_1 はデフォルトのバケットを使用します。

于 2014-12-18T08:14:50.553 に答える
8

PRIVATE_BUCKET_NAME ='bucket name'を使用して、settings.py で別のバケット名を指定するだけです。

S3BotoStorage をオーバーライドし、移行ファイルにシリアル化できるカスタム クラスを作成します。

クラスのオブジェクトを作成しs3_storage = S3MediaStorage()、MyModel の file1 フィールドのストレージに渡します

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

@deconstructible
class S3MediaStorage(S3BotoStorage):
    def __init__(self, *args, **kwargs):
        kwargs['bucket'] = getattr(settings, 'PRIVATE_BUCKET_NAME')
        super(S3MediaStorage, self).__init__(*args, **kwargs)

s3_storage = S3MediaStorage()

class MyModel(models.Model):
    file = models.FileField()
    file1 = models.FileField(storage=s3_storage)
于 2016-08-31T11:22:39.687 に答える