Reputation: 29590
Using Django, I want to make some data available for download.
My jQuery call looks like this so far:
$.getJSON("/get_data",
{ users: users, study: "{{study.id}}" } ,
function(json){
alert('some data!');
}
);
This calls one of my Django views, which in turn generates some JSON and attempts to make that JSON text in a file to download
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
However, this does not work. After looking around for a while, I believe I should change something on both ends – the Javascript and the python/Django code – but I'm unclear what exactly.
For Python, my main concern is in the use of cStringIO (especially the fact that I cannot execute close on jsonFile before returning without prompting a "ValueError: I/O operation on closed file").
Maybe I should also be using a FileWrapper (like in this post), but I get identical results with and without it.
For Javascript, I'm not sure what should go into my success handler function.
Any pointers would be greatly appreciated!
Upvotes: 6
Views: 5760
Reputation: 734
The classic solution for this is to use an hidden iframe
.
In your urls.py
url(r'^test/getFile', 'getFile')
In your 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
On your page
<script type="text/javascript">
var data = {name: 'Jon'};
$(function(){
$("body").append('<iframe src="/test/getFile?'+ $.param(data) + '" style="display: none;" ></iframe>');
});
</script>
Upvotes: 8