Django Request オブジェクトはファイルのようなインターフェイスを提供するため、そこからデータをストリーミングできます。ただし、Django は常にリクエスト全体をメモリ (ファイルのアップロードが大きすぎる場合は一時ファイル) に読み込むため、この API を使用できるのは、リクエスト全体を受信した後でのみです。一時ストレージ ディレクトリが十分に大きく、サーバー上でデータをバッファリングすることを気にしない場合は、特別なことをする必要はありません。ビュー内の S3 にデータをアップロードするだけです。ただし、タイムアウトには注意してください。S3 へのアップロードに時間がかかりすぎると、ブラウザはタイムアウトを受け取ります。したがって、一時ファイルをより永続的なディレクトリに移動し、のようなワーカー キューを介してアップロードを開始することをお勧めしますCelery
。
クライアントからサーバー経由で Amazon S3 に直接ストリーミングしたい場合は、 を使用することをお勧めしgevent
ます。gevent を使用するとgreenlet
、a から読み取り、queue
S3 に書き込む単純なものを作成できます。このキューは、リクエストから読み取る元の greenlet によって満たされます。
http://upload.example.com/
その特別なサーバーを展開する場所のような特別なアップロード URL を使用できます。Django_SETTINGS_MODULE 環境変数を設定し、ミドルウェアが通常行ういくつかのこと (データベースの接続/切断、トランザクションの開始/コミット/ロールバック、セッション処理など) を処理する場合、Django の関数を Django フレームワークの外部から使用できます。 .
カスタム WSGI アプリと Django を同じ WSGI コンテナーで一緒に実行することもできます。Django WSGI アプリをラップして、 へのリクエストをインターセプトするだけ/upload/
です。この場合gunicorn
、gevent worker-class
as サーバーを使用することをお勧めします。
私は Amazon S3 API にあまり詳しくありませんが、私が知る限り、ファイル アップロード用の一時トークンをユーザーから直接生成することもできます。そうすれば、サーバーを介してデータをトンネリングする必要がまったくなくなります。
編集:実際、バケットへの匿名アップロードを許可できます。このトピックについて話しているこの質問を参照してください: S3 - 匿名アップロード - キープレフィックス