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!
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>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With