開発プロセスの開発チームは、必然的にいくつかの困難や問題が発生しますが、彼らは最終的に克服する方法を見つけます。私たちは、この経験を記録する必要があると信じているので、[技術]のブログがあります。
Djangoのファイルが達成ダウンロード
1.背景
VisualPytorchプロジェクトでは、ファイルのダウンロード機能を提供する必要でした。当初、私はプログラムの約3種類があると思います
- 直接ファイルに文字列、クライアントの完了のフロントページへ。
検索元ポリシー異なるブラウザやセキュリティポリシーで見つかったプログラム情報は、あきらめることは困難同じではありません。
- サーバー上のファイルサービスを提供するために、ftpサーバシステムを開きます。
これは、最初のアイデアであり、後のサーバ自体の現在のパフォーマンスは、実際の需要に基づいて制限されていることを、プロジェクトファイルの現在のニーズと相まって、複雑なファイルサービス比較的簡単ではありません。
- HTTPストリームの形でパックを透過した後、直接ディレクトリを固定サーバーのファイルを生成します
そして、最終的にはこの方法は、比較的単純で実装が容易に使用します。
2、Djangoのバックエンドファイルのダウンロードとパッケージ化
ベールファイルについて、これを実装する際のpython zipファイルパッケージを使用します
zipf = zipfile.ZipFile("project_VisualPytorch.zip", 'w',zipfile.ZIP_DEFLATED)
zipファイルの使用の詳細については見つけることがhttps://docs.python.org/3/library/zipfile.html
HTTPはフロントエンドにデータを送信するように構成された応答オブジェクトを介してバックグラウンドサーバは、大容量のファイル転送のために、StreamingHttpResponse又はFileResponseフレーム構成Djangoの応答オブジェクトを使用することが推奨されます。
以下を達成するために、ストリーミングファイル、パラメータはイテレータで、ファイルの断片化転送を使用して、StreamingHttpResponse
response = StreamingHttpResponse(file_iterator("project_VisualPytorch.zip"))
response['Content-Type'] = 'application/zip'
response['Content-Disposition'] = 'attachment;filename="project_VisualPytorch.zip"'
return response
反復子の構築次のように
def file_iterator(file_name, chunk_size=512):
with open(file_name, 'rb') as f:
while True:
c = f.read(chunk_size)
if c:
yield c
else:
break
ここでフラグメントサイズ512が設けられています。
FileResponseは親クラスよりも優れたいくつかのケースでは、キャッシュ技術を使用してサブクラスStreamingHttpResponseです。