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

时间:2012-05-21 22:07:23

标签: jquery python django download

使用Django,我想提供一些可供下载的数据。

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

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

这会调用我的一个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

然而,这不起作用。看了一会儿后,我相信我应该改变两端的东西--Javascript和python / Django代码 - 但我不清楚到底是什么。

对于Python,我主要关注的是使用cStringIO(特别是在返回之前我无法在jsonFile上执行close而不提示“ValueError:对已关闭文件的I / O操作”)。

也许我也应该使用FileWrapper(就像在这个post中一样),但无论有没有,我都会得到相同的结果。

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

任何指针都将非常感谢!

1 个答案:

答案 0 :(得分:7)

这方面的经典解决方案是使用隐藏的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>