6

Django を使用して、一部のデータをダウンロードできるようにしたいと考えています。

これまでのところ、私のjQuery呼び出しは次のようになります。

$.getJSON("/get_data", 
            { users: users, study: "{{study.id}}" } ,
            function(json){
                alert('some data!');
            }
);

これにより、私の Django ビューの 1 つが呼び出され、JSON が生成され、ダウンロードするファイルにその JSON テキストが作成されます。

jsonResponse = json.dumps(data, cls=DjangoJSONEncoder)

jsonFile = cStringIO.StringIO()
jsonFile.write(jsonResponse)

response = HttpResponse(jsonFile, mimetype='application/json')
response['Content-Disposition'] = 'attachment; filename=data.txt'

return response

ただし、これは機能しません。しばらく見回した後、両端 (Javascript と python/Django コード) で何かを変更する必要があると思いますが、正確に何を変更するかは不明です。

Python の場合、私の主な関心事はcStringIOの使用です(特に、「ValueError: I/O operation on closed file」というメッセージを表示せずに戻る前に jsonFile で close を実行できないという事実)。

たぶん、FileWrapper も使用する必要があるかもしれませんが (この投稿のように)、それを使用しても使用しなくても同じ結果が得られます。

Javascript の場合、成功ハンドラー関数に何を入れるべきかわかりません。

どんなポインタでも大歓迎です!

4

1 に答える 1

8

これに対する古典的な解決策は、 hidden を使用することiframeです。

あなたのurls.py

url(r'^test/getFile', 'getFile')

あなたのviews.py

def getFile(request):
    fileContent = "Your name is %s" % request.GET['name']
    res = HttpResponse(fileContent)
    res['Content-Disposition'] = 'attachment; filename=yourname.txt'
    return res

あなたのページで

<script type="text/javascript">
    var data = {name: 'Jon'};
    $(function(){
        $("body").append('<iframe src="/test/getFile?'+ $.param(data) + '" style="display: none;" ></iframe>');
    });
</script>
于 2012-05-22T01:56:24.633 に答える