36

私はこのファイルストレージエンジンを使用して、ファイルがアップロードされたときにAmazonS3にファイルを保存しています。

http://code.welldev.org/django-storages/wiki/Home

応答がクライアントに返される前に、ファイルを最初にクライアントからWebサーバーにアップロードし、次にWebサーバーをAmazon S3にアップロードする必要があるため、アップロードにはかなり長い時間がかかります。

ファイルをS3に送信するプロセスを非同期にして、応答をユーザーにはるかに速く返すことができるようにしたいと思います。ファイルストレージエンジンでこれを行うための最良の方法は何ですか?

アドバイスありがとうございます!

4

7 に答える 7

24

私はこの問題に対して別のアプローチを取りました。

私のモデルには 2 つのファイル フィールドがあり、1 つは標準のファイル ストレージ バックエンドを使用し、もう 1 つは s3 ファイル ストレージ バックエンドを使用します。ユーザーがファイルをアップロードすると、ローカルに保存されます。

私のアプリケーションには、ローカルに保存されたすべてのファイルを s3 にアップロードしてモデルを更新する管理コマンドがあります。

そのため、ファイルのリクエストが来ると、モデル オブジェクトが s3 ストレージ フィールドを使用しているかどうかを確認します。使用している場合は s3 の正しい URL にリダイレクトを送信し、そうでない場合はリダイレクトを送信して、nginx がディスクからファイルを提供できるようにします。 .

もちろん、この管理コマンドは、cronjob などの任意のイベントによってトリガーできます。

于 2009-03-22T16:35:38.210 に答える
22

ユーザーが特別なフォーム (隠しフィールドに暗号化されたポリシー ドキュメントを含む) を使用して、ブラウザから S3 にファイルを直接アップロードすることが可能です。アップロードが完了すると、アプリケーションにリダイレクトされます。

詳細はこちら: http://developer.amazonwebservices.com/connect/entry.jspa?externalID=1434

于 2009-05-11T14:01:49.737 に答える
18

そのためのアプリがあります:-)

https://github.com/jezdez/django-queued-storage

「ローカル」ストレージと「リモート」ストレージを設定できるため、まさに必要なことを実行できます。このアプリはファイルを高速な「ローカル」ストレージ (MogileFS ストレージなど) に保存し、Celery (django-celery) を使用て「リモート」ストレージへの非同期アップロードを試みます。

いくつかのコメント:

  1. 注意が必要なのは、アップロード後にローカル ファイルを削除する戦略をコピーしてアップロードするか、アップロードして削除するように設定できることです。

  2. 2 番目のトリッキーなこと - アップロードされない限り、「ローカル」ストレージからファイルを提供します。

  3. また、アップロードの失敗時に再試行回数を設定することもできます。

インストールと使用法も非常にシンプルで簡単です。

pip install django-queued-storage

に追加INSTALLED_APPS:

INSTALLED_APPS += ('queued_storage',)

models.py:

from queued_storage.backends import QueuedStorage
queued_s3storage = QueuedStorage(
    'django.core.files.storage.FileSystemStorage',
    'storages.backends.s3boto.S3BotoStorage', task='queued_storage.tasks.TransferAndDelete')

class MyModel(models.Model):
    my_file = models.FileField(upload_to='files', storage=queued_s3storage)
于 2012-03-21T06:18:09.447 に答える
3

Webアプリケーションサーバーを使用せずに、メディアをs3サーバーに直接アップロードできます。

次の参考資料を参照してください。

Amazon APIリファレンス:http ://docs.amazonwebservices.com/AmazonS3/latest/dev/index.html?UsingHTTPPOST.html

djangoの実装:https ://github.com/sbc/django-uploadify-s3

于 2011-04-16T03:11:57.253 に答える
0

ここでの回答の一部はS3に直接アップロードすることを示唆しているため、pluploadを使用したDjango S3 Mixinは次のとおりです: https ://github.com/burgalon/plupload-s3mixin

于 2011-09-05T08:28:12.970 に答える
0

アップロードされた画像で同じ問題が発生しました。Celery はタスクへの引数をピクルできる必要があるため、Celery ワーカーにファイルを渡すことはできません。私の解決策は、画像データを文字列に分解し、ファイルから他のすべての情報を取得して、このデータと情報をタスクに渡し、そこで画像を再構築することでした。その後、保存すると、ストレージ バックエンド (S3 など) に送信されます。イメージをモデルに関連付ける場合は、インスタンスの ID をタスクに渡してそこで取得し、イメージをインスタンスにバインドしてインスタンスを保存します。

ファイルがフォーム経由でアップロードされると、ビューで UploadedFile ファイルのようなオブジェクトとして使用できます。request.FILES から直接取得するか、最初にフォームにバインドし、is_valid を実行して、form.cleaned_data からファイルのようなオブジェクトを取得できます。その時点で、少なくともそれがあなたが望む種類のファイルであることがわかります。その後、read() を使用してデータを取得し、他のメソッド/属性を使用して他の情報を取得できます。https://docs.djangoproject.com/en/1.4/topics/http/file-uploads/を参照してください。

実際に、画像を非同期に保存するための小さなパッケージを作成して配布することになりました。https://github.com/gterzian/django_asyncをご覧ください。これは画像専用であり、フォークして状況に応じた機能を追加できます。https://github.com/duointeractive/django-athumbと S3で使用しています

于 2013-02-12T10:50:19.930 に答える