このドキュメントの Django のバージョンにはセキュリティ上の脆弱性があるため、すでにサポートが終了されています。新しいバージョンにアップグレードしてください!最新の Django のバージョンのドキュメントはこちら

Django v1.0 documentation

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

revision-up-to:8961 (1.0)

ファイルを遠隔のシステム上に保存したい場合のように、カスタムのファイルスト レージを作成したいときのために、カスタムストレージクラスを定義できます。 カスタムストレージは、以下のステップに従って作成します:

  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() メソッドを提供せねばなりません。

カスタムのストレージシステムでは、以下のストレージメソッドをオーバライドで きます。メソッドの詳細は ファイルストレージ API で解説していますが、少な くとも以下のメソッドは 実装せねばなりません :

  • Storage.delete()
  • Storage.exists()
  • Storage.listdir()
  • Storage.size()
  • Storage.url()

また、カスタムのストレージオブジェクトを実装するために用意されている、以下 のフックを使うことになるでしょう:

_open(name, mode='rb')

必須のメソッドです.

Storage.open() によって呼び出されます。このメソッドこそが、ストレージク ラスがファイルをオープンするときの実際のメカニズムです。このメソッドは File クラスのオブジェクトを返さねばなりません。とはいえ、たいていのケー スでは、バックエンドストレージに固有のロジックを備えた File のサブクラ スを返すことでしょう。

_save(name, content)

Storage.save() から呼び出されます。 nameget_valid_name()get_available_name() で処理済の名前で、 contentFile オブ ジェクトです。このメソッドの戻り値はありません。

get_valid_name(name)

背後にあるストレージシステムで扱うのに適したファイル名を生成して返します。 通常、このメソッドの name 引数は、サーバに送信されたもとのファイルパス ら、パス部分を取り除いたファイルの名前です。標準の方法とは違うやりかたで安 全なファイル名への変換を行いたいなら、このメソッドをオーバライドしてくださ い。

Storage の実装では、ファイル名から英数文字、ピリオド、アンダースコアを 除く全ての文字を取り去ります。

get_available_name(name)

name に指定された名前をもとに、ストレージ機構で扱えるファイル名を構築し て返します。通常、 name 引数は、上で述べた get_valid_name() メソッ ドによって、ストレージシステムで扱うのに適した名前に変換済みです。

Storage の実装では、対象ディレクトリ下でファイル名が重複しそうな場合、 一意になるまでアンダースコアを付加したファイル名を作成して返します。