6

使用 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 operation on closed file”)。

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

对于 Javascript,我不确定我的成功处理程序函数应该包含什么。

任何指针将不胜感激!

4

1 回答 1

8

对此的经典解决方案是使用隐藏的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 回答