用django生成一个文件,用javascript/jQuery下载

art*_*omp 6 python django jquery download

使用Django,我想让一些数据可供下载.

到目前为止,我的jQuery调用看起来像这样:

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

这会调用我的一个Django视图,然后生成一些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
Run Code Online (Sandbox Code Playgroud)

但是,这不起作用.环顾四周后,我相信我应该改变两端的东西--Javascript和python/Django代码 - 但我不清楚到底是什么.

对于Python,我主要关心的是使用cStringIO(尤其是在返回之前我不能在jsonFile上执行close而不提示"ValueError:对已关闭文件的I/O操作").

也许我也应该使用FileWrapper(就像在这篇文章中一样),但是无论有没有它我都会得到相同的结果.

对于Javascript,我不确定应该进入我的成功处理函数.

任何指针将不胜感激!

xbt*_*tsw 8

对此的经典解决方案是使用隐藏iframe.

在你的 urls.py

url(r'^test/getFile', 'getFile')
Run Code Online (Sandbox Code Playgroud)

在你的 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
Run Code Online (Sandbox Code Playgroud)

在您的页面上

<script type="text/javascript">
    var data = {name: 'Jon'};
    $(function(){
        $("body").append('<iframe src="/test/getFile?'+ $.param(data) + '" style="display: none;" ></iframe>');
    });
</script>
Run Code Online (Sandbox Code Playgroud)