Python Flask - Как загрузить файл с помощью send_from_directory И отобразить текстовый вывод в браузере

Я хотел бы иметь возможность выводить сообщение пользователю после загрузки, инициированной через send_from_directory.

@app.route('/downloadFile', methods=['GET'])
def download():

    return send_from_directory(output_directory, "myfile.txt", as_attachment=True)

Это вызовет загрузку после посещения конечной точки /downloadFile, но в дополнение к запуску загрузки я хотел бы иметь вывод в браузере, который говорит что-то вроде "загрузка файла запущена". Есть ли способ добиться этого? Если бы я не использовал send_from_directory, я мог бы сделать что-то вроде этого, чтобы вернуть некоторый JSON return {'Status': 'file download triggered'}

Я ищу способ объединить эти два способа, чтобы пользователь не видел пустой экран при нажатии на эту конечную точку.

Вы можете сделать следующее: вернуть render_template() в данной конечной точке, чтобы создать html-файл, который отобразит что-то вроде "ваш файл сейчас загружается" или любое другое сообщение, которое вы хотите, и в том же html-файле использовать JS для запуска второй конечной точки, которая загрузит файл.

@app.route('/downloadPage', methods=['GET'])
def download_page():
    return render_template("download_page.html")

@app.route('/downloadFile')
def download_file():
    return send_from_directory(output_directory, "myfile.txt", as_attachment=True)

В HTML-файле JS будет иметь вид -

<SCRIPT>
   window.location.href = "/DownloadFile";
</SCRIPT>

На любой запрос может быть только один ответ. Ответ HTML-страницы и ответ загрузки файла должны быть собственными ответами на два отдельных запроса.

Чтобы получить желаемый эффект, вам потребуется две конечные точки: одна конечная точка для возврата HTML-ответа, а вторая конечная точка для обработки загрузки файла.

Ваш HTML-ответ от первого маршрута может содержать код javascript для инициирования загрузки файла со второй конечной точки. Реализация этого может выглядеть примерно так, как показано в ответе pushpak ruhil's answer.

Вернуться на верх