使用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,我不确定应该进入我的成功处理函数。
任何指针都将非常感谢!
答案 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>