Search code examples
python-3.xflaskflask-wtformsflask-session

Flask file download: filename persists within the session


I have a flask site and a webform that generates excel files. The problem I'm having is, if I send the user back to the form to submit again, the previous file -- with same file name and data -- is downloaded even though new files are generated in the tmp directory. So, I think this has to do with my session variable.

I add a timestamp to the file name with this function to make sure the file names are unique:

def rightnow():
    return dt.datetime.now().strftime("%m%d%y%h%m%S%f")

In routes.py, here is the call for the download:

@app.route('/download/', methods=['POST','GET'])
def download_file():
    output_file = session.get('new_file', None)
    r = send_file(output_file, attachment_filename=output_file, as_attachment=True)
    return r

This is the code for the script that generates the excel files:

new_file = 'output_' + rightnow() + '.xlsx'
writer = pd.ExcelWriter('tmp/' + new_file, engine='xlsxwriter')
df.to_excel(writer, sheet_name="data")      
writer.save()
session['new_file'] = 'tmp/' + new_file

The download statement from the template page:

<a class="button" href="{{url_for('download_file')}}">Download new data</a>

I have a "Submit Again" button tied to simple javascript

<button onclick="goBack()">Submit Again</button>
<script>//for "revise search" button
function goBack() {
    window.history.back();
}
</script>

I have played around with session.clear() with no success.

How can I drop the session when the user click's the "Submit Again" button so the saved file name is dropped?

EDIT: I checked the variables for the filename and the session variable and they are identical, and different from the file name assigned on download. Forinstance, the file is named 'output_May0554733504.xlsx' by the script that I wrote -- I can see it in the tmp directory. But when I go to download the file, the filename is different: 'output_May0536794357.xlsx'

This other file name is not that of a different file in the tmp directory. Any file I download will be 'output_May0536794357.xlsx'.


Solution

  • If session.pop('new_file') doesn't work, you could try session.modified = True to force the change to the session.