В Flask, как я могу перенаправить на шаблон и показать сообщение после возвращения send_file в виде?
Я ныряю в Flask в первый раз и сталкиваюсь с небольшой проблемой. У меня есть страница с формой и кучей флажков. При отправке формы я беру значения из всех флажков и передаю их в скрипт (который у меня уже был), который в основном записывает файл CSV.
Что я делаю, так это то, что при отправке формы файл CSV создается в фоновом режиме и отправляется обратно пользователю для немедленной загрузки. Я получил эту часть работы, заставив мой скрипт создать файл в памяти ( используя StringIO), а затем вернув его, используя send_file от Flask.
Я хотел бы также дать пользователю некоторую обратную связь после того, как он загрузит файл, отправив сообщение в шаблон (вы можете спросить, почему я хочу уведомить пользователя, если он уже скачал файл - я просто хочу дать ему некоторая дополнительная информация). Однако после того, как моя функция просмотра вернула send_file и представила диалоговое окно загрузки в браузере, страница не перезагружается, поэтому флэш-сообщение не проходит.
Я борюсь с этим: как я могу вернуть файл, а также показать сообщение пользователю? Я понимаю, что на каждый запрос может быть только один ответ, поэтому, если я использую свой единственный шанс при загрузке файла, мне может понадобиться другая стратегия. Есть идеи?
Вот как выглядит мой "маршрут загрузки":
@app.route('/process', methods=["POST"])
def process():
error = None
if request.method == 'POST':
# gets all checkbox values
fields = request.form.getlist("field")
# generates my csv file
csv = generate_csv()
if len(fields) != 0:
csv = amxml2csv.xml2csv(xml, *fields)
flash("Extraction succeeded!")
return send_file(data, attachment_filename="newresults.csv", as_attachment=True)
else:
error = "No fields selected!"
return render_template("index.html", error=error)
1 ответ
У меня здесь такая же проблема. На полпути решение, которое я нашел, состоит в том, чтобы сделать
вернуть send_from_directory() и перенаправить (url_for())
Простой способ - открыть две конечные точки с помощью кнопки отправки данных, одну в новом окне.
Предположительно, вы возвращаете данные, поэтому вам может понадобиться какой-то способ кэширования данных для анализа сервером... возможно, вы могли бы встроить задержку для конечной точки обратной связи, которая может сделать данные доступными для сеанса; или предоставить вам время для получения функции конечной точки. затем верните отзыв.