【问题标题】:generating a file with django to download with javascript/jQuery使用 django 生成文件以使用 javascript/jQuery 下载
【发布时间】:2012-05-21 22:07:22
【问题描述】:

使用 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 的使用(尤其是在返回之前我无法在没有提示“ValueError: I/O operation on closed file”的情况下对 jsonFile 执行关闭)。

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

对于 Javascript,我不确定应该在我的成功处理函数中添加什么。

任何指针将不胜感激!

【问题讨论】:

  • 您想让用户看到文件下载对话框(保存、运行取消)还是只是想发送 JSON 数据以供 javascript 使用?
  • 前者 - 我想弹出一个“保存”浏览器对话框(据我了解,这应该与“Content-Disposition”标题一起发生,对吗?)
  • @amp,强制下载,而不是浏览器内渲染。强制保存文件似乎不是我们可以做的事情......例如,我所有的下载都直接进入我的下载目录。谷歌搜索显示类似的陈述......

标签: jquery python django download


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-28
    • 2021-12-18
    • 1970-01-01
    • 2017-04-01
    • 2018-05-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多