2

開発にFileSystemStorageを使用し、ステージングと本番にS3BotoStorageを使用するDjangoアプリケーションがあります。すべてが正常に機能しています。私が気付いたこれらのシステムの間にはいくつかの小さな違いがあります:

  1. FileSystemStorageは、保存するすべてのファイルにMEDIA_ROOT値を追加します。S3BotoStorageはデフォルトではありません。

  2. FileFieldを使用してモデルインスタンスを削除すると、ファイルがそのディレクトリ内の唯一のファイルである場合、S3BotoStorageはFileFieldのファイルとファイルが存在するディレクトリを削除します。FileSystemStorageは空のディレクトリを削除しません。

これらの違いを回避することはできますが、コードに条件が追加されます。これらの最初のものが最も簡単です-私はS3BotoStorageクラスをで初期化するだけlocation=MEDIA_ROOTです。同様の方法で2番目のものを処理する方法はありますか?どちらかのストレージクラスのディレクトリ削除動作を構成できますか?FileSystemStorageのdeleteメソッドをオーバーライドする必要がありますか?

4

1 に答える 1

3

(144行目)のコードにはFileSystemStorage.delete、私が見ることができる構成がありません:

def delete(self, name):
    name = self.path(name)
    # If the file exists, delete it from the filesystem.
    # Note that there is a race between os.path.exists and os.remove:
    # if os.remove fails with ENOENT, the file was removed
    # concurrently, and we can continue normally.
    if os.path.exists(name):
        try:
            os.remove(name)
        except OSError as e:
            if e.errno != errno.ENOENT:
                raise

したがって、最も単純でクリーンな方法は、おそらく削除メソッドをオーバーライドして、空のディレクトリのケースをさらにチェックすることです。

于 2012-10-25T17:46:30.330 に答える