I'm using python 3.5 and flask 0.10.1 and liking it, but having a bit of trouble with send_file. I ultimately want to process a pandas dataframe (from Form data, which is unused in this example but necessary in the future) and send it to download as a csv (without a temp file). The best way to accomplish this I've seen is to us StringIO.
Here is the code I'm attempting to use:
@app.route('/test_download', methods = ['POST']) def test_download(): buffer = StringIO() buffer.write('Just some letters.') buffer.seek(0) return send_file(buffer, as_attachment = True,\ attachment_filename = 'a_file.txt', mimetype = 'text/csv')
A file downloads with the proper name, however the file is completely blank.
Any ideas? Issues with encoding? Has this been answered elsewhere? Thanks!
The issue here is that in Python 3 you need to use StringIO
with csv.write
and send_file
requires BytesIO
, so you have to do both.
@app.route('/test_download') def test_download(): row = ['hello', 'world'] proxy = io.StringIO() writer = csv.writer(proxy) writer.writerow(row) # Creating the byteIO object from the StringIO Object mem = io.BytesIO() mem.write(proxy.getvalue().encode()) # seeking was necessary. Python 3.5.2, Flask 0.12.2 mem.seek(0) proxy.close() return send_file( mem, as_attachment=True, attachment_filename='test.csv', mimetype='text/csv' )
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