0

できればDjango(または他の同等のフレームワーク)を使用して、アップロードされたコンテンツをチャンクごとに奇妙な圧縮形式(LZMA、7zipなど)にすぐに圧縮する例を作成しようとしています。次に、S3 への別のアップロード要求に書き出されます。

本質的に、これは何が起こるかです:

  1. ユーザーが のエンドポイントへのマルチパート アップロードを開始します^/upload/?$
  2. サーバーでチャンクが受信されると (1024 バイトまたはその他の数値である可能性があります)、チャンクで圧縮アルゴリズムを通過します。
  3. 圧縮された出力は、ネットワーク経由で S3 バケットに書き出されます。

ステップ 3 はオプションです。ファイルをローカルに保存し、メッセージ キューに遅延アップロードを実行させることができます。

Django のようなフレームワークを使用してステップ 2 は可能ですか? ファイルのようなオブジェクトで受信データにアクセスする低レベルの方法はありますか?

4

1 に答える 1

0

Django Request オブジェクトはファイルのようなインターフェイスを提供するため、そこからデータをストリーミングできます。ただし、Django は常にリクエスト全体をメモリ (ファイルのアップロードが大きすぎる場合は一時ファイル) に読み込むため、この API を使用できるのは、リクエスト全体を受信した後でのみです。一時ストレージ ディレクトリが十分に大きく、サーバー上でデータをバッファリングすることを気にしない場合は、特別なことをする必要はありません。ビュー内の S3 にデータをアップロードするだけです。ただし、タイムアウトには注意してください。S3 へのアップロードに時間がかかりすぎると、ブラウザはタイムアウトを受け取ります。したがって、一時ファイルをより永続的なディレクトリに移動し、のようなワーカー キューを介してアップロードを開始することをお勧めしますCelery


クライアントからサーバー経由で Amazon S3 に直接ストリーミングしたい場合は、 を使用することをお勧めしgeventます。gevent を使用するとgreenlet、a から読み取り、queueS3 に書き込む単純なものを作成できます。このキューは、リクエストから読み取る元の greenlet によって満たされます。

http://upload.example.com/その特別なサーバーを展開する場所のような特別なアップロード URL を使用できます。Django_SETTINGS_MODULE 環境変数を設定し、ミドルウェアが通常行ういくつかのこと (データベースの接続/切断、トランザクションの開始/コミット/ロールバック、セッション処理など) を処理する場合、Django の関数を Django フレームワークの外部から使用できます。 .

カスタム WSGI アプリと Django を同じ WSGI コンテナーで一緒に実行することもできます。Django WSGI アプリをラップして、 へのリクエストをインターセプトするだけ/upload/です。この場合gunicorngevent worker-classas サーバーを使用することをお勧めします。


私は Amazon S3 API にあまり詳しくありませんが、私が知る限り、ファイル アップロード用の一時トークンをユーザーから直接生成することもできます。そうすれば、サーバーを介してデータをトンネリングする必要がまったくなくなります。

編集:実際、バケットへの匿名アップロードを許可できます。このトピックについて話しているこの質問を参照してください: S3 - 匿名アップロード - キープレフィックス

于 2013-02-05T22:00:18.177 に答える