カスタムストレージシステムの作成
カスタムファイルストレージを提供する必要がある場合(一般的な例は、リモートシステムにファイルを保存することです)、カスタムストレージクラスを定義することでそれを行うことができます。 次の手順に従う必要があります。
カスタムストレージシステムは、
django.core.files.storage.Storage
のサブクラスである必要があります。from django.core.files.storage import Storage class MyStorage(Storage): ...
Djangoは、引数なしでストレージシステムをインスタンス化できる必要があります。 これは、すべての設定を
django.conf.settings
から取得する必要があることを意味します。from django.conf import settings from django.core.files.storage import Storage class MyStorage(Storage): def __init__(self, option=None): if not option: option = settings.CUSTOM_STORAGE_OPTIONS ...
ストレージクラスは、 _open()メソッドと _save()メソッドを、ストレージクラスに適した他のメソッドとともに実装する必要があります。 これらの方法の詳細については、以下を参照してください。
さらに、クラスがローカルファイルストレージを提供する場合は、
path()
メソッドをオーバーライドする必要があります。ストレージクラスは deconstructible である必要があります。これにより、移行のフィールドで使用するときにシリアル化できます。 フィールドにそれ自体が serializable である引数がある限り、これには
django.utils.deconstruct.deconstructible
クラスデコレータを使用できます(これはDjangoがFileSystemStorageで使用するものです)。
デフォルトでは、次のメソッドはNotImplementedError
を発生させ、通常はオーバーライドする必要があります。
ただし、これらすべての方法が必要なわけではなく、意図的に省略される場合があることに注意してください。 たまたま、各メソッドを実装せずにそのままにして、ストレージを機能させることができます。
例として、特定のストレージバックエンドのコンテンツを一覧表示するのに費用がかかることが判明した場合は、Storage.listdir()
を実装しないことを決定する場合があります。
もう1つの例は、ファイルへの書き込みのみを処理するバックエンドです。 この場合、上記のメソッドを実装する必要はありません。
最終的に、これらのメソッドのどれを実装するかはあなた次第です。 一部のメソッドを実装しないままにしておくと、インターフェイスが部分的に(おそらく壊れて)発生します。
また、通常、カスタムストレージオブジェクト用に特別に設計されたフックを使用することもできます。 これらは:
- _open(name, mode='rb')
必須。
Storage.open()
によって呼び出されます。これは、ストレージクラスがファイルを開くために使用する実際のメカニズムです。 これはFile
オブジェクトを返す必要がありますが、ほとんどの場合、バックエンドストレージシステムに固有のロジックを実装するサブクラスをここで返す必要があります。
- _save(name, content)
Storage.save()
によって呼び出されます。 name
はすでにget_valid_name()
とget_available_name()
を通過しており、content
はFile
オブジェクト自体になります。
保存されたファイルの名前の実際の名前を返す必要があります(通常はname
が渡されますが、ストレージでファイル名を変更する必要がある場合は、代わりに新しい名前を返します)。
- get_valid_name(name)
基盤となるストレージシステムでの使用に適したファイル名を返します。 このメソッドに渡されるname
引数は、サーバーに送信された元のファイル名であるか、upload_to
が呼び出し可能である場合は、パス情報が削除された後にそのメソッドによって返されるファイル名です。 これをオーバーライドして、非標準文字を安全なファイル名に変換する方法をカスタマイズします。
Storage
で提供されるコードは、元のファイル名から英数字、ピリオド、およびアンダースコアのみを保持し、他のすべてを削除します。
- get_alternative_name(file_root, file_ext)
バージョン3.0の新機能。
file_root
およびfile_ext
パラメーターに基づいて代替ファイル名を返します。 デフォルトでは、アンダースコアとランダムな7文字の英数字の文字列がファイル名の拡張子の前に追加されます。
- get_available_name(name, max_length=None)
おそらく提供されたファイル名を考慮に入れて、ストレージメカニズムで使用可能なファイル名を返します。 このメソッドに渡されたname
引数は、上記のget_valid_name()
メソッドに従って、ストレージシステムに有効なファイル名に既にクリーンアップされています。
ファイル名の長さは、提供されている場合、max_length
を超えることはありません。 空きの一意のファイル名が見つからない場合、 SuspiciousFileOperation 例外が発生します。
name
のファイルがすでに存在する場合は、get_alternative_name()
が呼び出されて代替名が取得されます。