Самый простой способ сделать загрузку так, как вы просите, чтобы использовать target="_blank"
в вашей форме:
<form action="/MyPage" method="POST" target="_blank">
<ul>
{% for input in form %}
<li>{{ input.label }} {{ input }}</li>
{% endfor %}
</ul>
</form>
Тогда ваш POST
метод обработки не должен ничего делать, кроме как вернуть CSV:
@app.route('/MyPage', methods=['GET', 'POST'])
def MyPage():
if request.method == 'POST':
# Turn `request.form` into a CSV
# see https://stackoverflow.com/q/26997679/135978 for an example
headers = {'Content-Disposition': 'attachment; filename=saved-form.csv', 'Content-Type': 'text/csv'}
return form_as_csv, headers
else:
# Do some other stuff
Если вам нужно несколько кнопок в форме, тогда вместо установки target
в форме вы можете просто установить formtarget="_blank"
на кнопку, которая вызывает CSV:
<form action="/MyPage" method="POST">
<ul><!-- ... snip ... --></ul>
<button name="submit_action" value="SAVE_AS_CSV" formtarget="_blank">Save as CSV</button>
<button name="submit_action" value="RUN_CALCULATION">Run Calculation</button>
</form>
Тогда вам просто нужно добавить чек на request.form['submit_action']
в свой блок if request.method == 'POST'
, и вы отправитесь в гонки:
if request.method == 'POST':
if request.form['submit_action'] == 'SAVE_AS_CSV':
# Return the CSV response
else:
# Return the calculation response
См. Также: Запись CSV из среды Flask