みーのぺーじ

みーが趣味でやっているPCやソフトウェアについて.Python, Javascript, Processing, Unityなど.

Djangoでファイルをダウンロードする

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のデータベースも簡単に扱えるようになりそうです.