カスタムストレージシステムの作成—Djangoドキュメント

提供:Dev Guides
< DjangoDjango/docs/3.2.x/howto/custom-file-storage
移動先:案内検索

カスタムストレージシステムの作成

カスタムファイルストレージを提供する必要がある場合(一般的な例は、リモートシステムにファイルを保存することです)、カスタムストレージクラスを定義することでそれを行うことができます。 次の手順に従う必要があります。

  1. カスタムストレージシステムは、django.core.files.storage.Storageのサブクラスである必要があります。

    from django.core.files.storage import Storage
    
    class MyStorage(Storage):
        ...
  2. 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
            ...
  3. ストレージクラスは、 _open()メソッドと _save()メソッドを、ストレージクラスに適した他のメソッドとともに実装する必要があります。 これらの方法の詳細については、以下を参照してください。

    さらに、クラスがローカルファイルストレージを提供する場合は、path()メソッドをオーバーライドする必要があります。

  4. ストレージクラスは 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()を通過しており、contentFileオブジェクト自体になります。

保存されたファイルの名前の実際の名前を返す必要があります(通常はnameが渡されますが、ストレージでファイル名を変更する必要がある場合は、代わりに新しい名前を返します)。

get_valid_name(name)

基盤となるストレージシステムでの使用に適したファイル名を返します。 このメソッドに渡されるname引数は、サーバーに送信された元のファイル名であるか、upload_toが呼び出し可能である場合は、パス情報が削除された後にそのメソッドによって返されるファイル名です。 これをオーバーライドして、非標準文字を安全なファイル名に変換する方法をカスタマイズします。

Storageで提供されるコードは、元のファイル名から英数字、ピリオド、およびアンダースコアのみを保持し、他のすべてを削除します。

get_alternative_name(file_root, file_ext)

file_rootおよびfile_extパラメーターに基づいて代替ファイル名を返します。 デフォルトでは、アンダースコアとランダムな7文字の英数字の文字列がファイル名の拡張子の前に追加されます。

get_available_name(name, max_length=None)

おそらく提供されたファイル名を考慮に入れて、ストレージメカニズムで使用可能なファイル名を返します。 このメソッドに渡されたname引数は、上記のget_valid_name()メソッドに従って、ストレージシステムに有効なファイル名に既にクリーンアップされています。

ファイル名の長さは、提供されている場合、max_lengthを超えることはありません。 空きの一意のファイル名が見つからない場合、 SuspiciousFileOperation 例外が発生します。

nameのファイルがすでに存在する場合は、get_alternative_name()が呼び出されて代替名が取得されます。