Djangoでサーバーからファイルをダウンロードする方法を紹介します.
view.pyにて,download(request)を実行するとファイルがダウンロードされるようにします.python3.4にて確認済み.
テキストファイル .txt
from django.http import HttpResponse
import io
def download(request):
output = io.StringIO()
output.write("First line.\n")
response = HttpResponse(output.getvalue(), content_type="text/plain")
response["Content-Disposition"] = "filename=text.txt"
return response
まず,outputにio.StringIO()にてfilelikeなオブジェクトを生成します.サーバーの適当なディレクトリにファイルを書き出すのもよいですが,ディスクにアクセスするよりはメモリーでファイルを扱えるStringIOの方がパフォーマンスが向上するはずなので,ここではこのようにしています.
StringIOでは,write()とgetvalue()にて値の出し入れを行います.getvalue()したものをHttpResponseの引数として,content_type (mime typeのこと) をtext/plainとしています.
最後にContent-Disposition にファイル名を指定して完了です.ブラウザーからアクセスすれば,First line.と表示されます.
エクセルファイル .xls
先ほどのテキストファイルとほぼ同様なのですが,簡単なサンプルを掲載しておきます.python3.4 と xlwt-future 0.8.0 にて動作確認済み.
from django.http import HttpResponse
import xlwt
import io
def download(request):
output = io.BytesIO()
#
wb = xlwt.Workbook()
ws = wb.add_sheet("sheet 1")
for i in range(100):
ws.write(i//10, i%10, i)
wb.save(output)
#
response = HttpResponse(output.getvalue(), content_type="application/excel")
response["Content-Disposition"] = "filename=text.xls"
return response
エクセルファイルはバイナリなので,io.BytesIOを使います.mimetypeにapplication/excelを指定して,完了です.上記の例では,シートを1つ作成して,数字を100まで10×10に配置したエクセルファイルが生成されてダウンロードされます.
これを利用すれば,Djangoのデータベースも簡単に扱えるようになりそうです.