В 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())

Простой способ - открыть две конечные точки с помощью кнопки отправки данных, одну в новом окне.

Предположительно, вы возвращаете данные, поэтому вам может понадобиться какой-то способ кэширования данных для анализа сервером... возможно, вы могли бы встроить задержку для конечной точки обратной связи, которая может сделать данные доступными для сеанса; или предоставить вам время для получения функции конечной точки. затем верните отзыв.

Другие вопросы по тегам