1

django-storages を使用してメディア ファイルを S3 バケットに保存しています。ただし、ファイルを変換したり、新しいファイルを作成するためにファイルをいじったりすることがあります。このいじりは、サーバー上の実際のファイルを使用する必要があります (ほとんどの変換はプロセス呼び出しを使用して行われます)。完了したら、ファイルを S3 に保存したいと思います。

理想的な世界では、ローカルから S3 に移行するときに関数を変更する必要はありません。ただし、これらの中間ローカル ファイルを作成していじる必要があることを考えると、これをどのように行うかはわかりません。最終的には、結果のファイル (ローカル マシンにも保存される) を作成する必要があることがわかります。 S3にコピーしました。

1 つはソース ファイル用、もう 1 つは宛先ファイル用の 1 組のコンテキスト ガードを使用して思いつくことができる最善の方法です。ソースファイルは、コピーされたソースファイルの内容を取得する一時ファイルを作成し、それを使用、操作などします。宛先ファイルのコンテキストガードは、S3 で最終的な目的の宛先パスを取得し、一時ローカル ファイルを作成し、終了時に S3 バケットにキーを作成し、一時ファイルの内容をコピーして削除します。

しかし、これは私にはかなり複雑に思えます。また、これらのファイルを操作するすべての関数を 2 つの "with" 句でラップする必要があります。

私が考えることができる他の唯一の解決策は、ファイル名ではなくファイルのようなオブジェクトのみを処理するユーティリティに切り替えることですが、これはサブプロセス呼び出しを実行できないことを意味します。

4

1 に答える 1

1

組み込みのファイル ストレージ APIを見てみましょう。これはまさにその使用例です。

django-storages を使用して S3 にアップロードしている場合は、設定モジュールに次のような行が必要です。

DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3BotoStorage'

ローカルで開発していて、メディア ファイルを S3 にアップロードしたくない場合は、ローカル設定モジュールで省略して、デフォルトでdjango.core.files.storage.FileSystemStorage.

アプリケーション コードで、ローカル開発からステージングに移行するときに S3 に保存されるメディア ファイルについて、関数Storageから返されたクラスを使用してオブジェクトをインスタンス化し、このオブジェクトを使用してファイルを操作します。get_storage_class「いじっている」一時的なローカル ファイルについては、StorageS3 に保存するファイルでない限り、このオブジェクトを使用しないでください (つまり、Python の組み込みファイル処理関数を使用します)。

S3 への保存を開始する準備ができたら、DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3BotoStorage'再度設定するだけで、コードは他の微調整なしで機能します。この設定が設定されていない場合、これらのメディア ファイルは の下のローカル ファイル システムに保存されます。このMEDIA_ROOT場合も、アプリケーション ロジックを変更する必要はありません。

于 2014-05-28T03:35:56.117 に答える