Как отобразить HTML, а затем перенаправить на загрузку с помощью Flask - PullRequest
0 голосов
/ 09 ноября 2019

Я совершенно новичок в Flask и веб-разработке, поэтому, пожалуйста, не обращайте внимания на отсутствие надлежащей терминологии, которую я, вероятно, использую.

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

Я ограничен использованием Flask и Python 2.7 дляэта задача.

Я пытался вернуть html и функцию send_file(path_to_file) в виде кортежа, а также пытался создать новый поток для функции send_file(), но ни одна из них не сработала.

Я не знаю, что делать дальше.

Вот код, показывающий, где я сейчас нахожусь:


import backend
import threading
from flask import request, send_file

def get_package(post_data):
    file_path = backend.get_package(post_data)
    return send_file(file_path)

@app.route("/pkg_download", method=['POST'])
def pkg_download():
    post_data = dict(request.form.iterlists())
    result = threading.Thread(None, target=get_package, args=[post_data])
    result.start()

    html_dialog = "<p>Packaging Images</p>"
    return html_dialog

Когда язапустить выше, я получаю эту ошибку:

RuntimeError: Working outside of application context.

вместо отображения html, а затем загрузка файла после того, как пакет будет выполнен zip.

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

1 Ответ

0 голосов
/ 09 ноября 2019

То, что вы хотите сделать, не должно быть сделано в запросе API к серверу напрямую. Создание архива может занять некоторое время, и, как правило, лучше сразу ответить на полученный вами запрос и запустить фоновую задачу для выполнения более длительной операции.

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

Предложение по реализации:

  • Ваш клиент отправляет запрос на ваш сервер Flask с файлами, которые пользователь хочет сжать
  • Вы получаете файлы на Flask и сохраняете их где-то
  • Из этой же функции вы запускаете задачу Celery с информацией о клиенте, который выполнил запрос, и пути к нему. файлы, которые он загрузил
  • Вы сжимаете файлы в задаче сельдерея, после успешного завершения вы можете отправить уведомление пользователю (для отправки уведомления вы можете использовать веб-сокет, который вы отправляете в интерфейс)

Эта реализация позволит вам кодировать следующую логику и иметь такое поведение ввнешний интерфейс вашего сайта:

  • Создайте веб-сокет, который подключен к вашему бэкэнду и который позволит вам общаться с клиентом
  • Пользователь выбирает файлы, которые он хочет сжать
  • Вы начинаете отправлять их на свой сервер (Flask API)
  • Вы помещаете загрузочное сообщение о том, что его файлы в настоящее время загружаются
  • Когда вы получаете ответ APIзапросить вы можете отобразить сообщение об успешной загрузке файлов
  • Вы помещаете сообщение о том, что сжатие его файлов в настоящее время обрабатывается вашим сервером
  • Когда вы получаете интерфейсwebsocket со ссылкой на архив вы отображаете его соответственно для пользователя

И вуаля вам должно быть хорошо идти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...