Как вернуть несколько ответов из одного маршрута приложения: Flask (Python) - PullRequest
0 голосов
/ 23 апреля 2020

Я разместил приложение Flask на Heroku, написанное на Python. У меня есть функция, которая выглядит примерно так:

@app.route("/execute")
def execute():
    doSomething()
    return Response()

Теперь проблема в том, что для выполнения doSomething() требуется более 30 секунд, минуя 30-секундный тайм-аут Heroku, и это убивает приложение.

Я мог бы создать другой поток и выполнить внутри него doSomething(), но объект Response должен вернуть файл, который будет доступен только после того, как doSomething() завершит выполнение.

Я также пытался работать с генераторами и yield, но также не мог заставить их работать. Что-то вроде:

@app.route("/execute")
def execute():
    def generate():
        yield ''
        doSomething()
        yield file
    return Response(generate())

, но приложение требует, чтобы я обновил sh страницу, чтобы получить второй полученный объект.

Что мне в основном нужно сделать, это вернуть пустой Response объект изначально, запустите выполнение doSomething(), а затем верните другой Response объект. Как мне выполнить sh это?

Ответы [ 3 ]

1 голос
/ 23 апреля 2020

То, что вы пытаетесь сделать, является асинхронной работой. Для этого я рекомендую вам использовать Celery (здесь у вас есть хороший пример: https://blog.miguelgrinberg.com/post/using-celery-with-flask/page/7) или какой-то другой инструмент для асинхронных заданий. Во внешнем интерфейсе вы можете сделать простой пул для ожидания ответа, я рекомендую вам использовать SocketIO (https://socket.io/). Это простое и эффективное решение.

1 голос
/ 23 апреля 2020

Это в основном асинхронная работа. Для этих операций вы можете использовать Сельдерей или Asyncio . Вы никогда не можете попросить любого пользователя ждать более 3 секунд - 10 секунд для любой операции.

1) Сделайте AJAX Запрос

2) Инициализируйте сокет, который слушает вашу операцию.

3) Как только вы закончите sh операцию, сокет отправляет сообщение обратно, вы можете показать пользователю позже через всплывающее окно.

Это лучший подход, который вы можете do

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

1 голос
/ 23 апреля 2020

Обычно для http один запрос означает один ответ. используются для большого ответа со многими частями.

Сокеты , чтобы разрешить несколько "ответов" для одного "запроса". Создание нескольких запросов с вашим клиентом, если вы иметь контроль над своим клиентским кодом, это, скорее всего, самое простое решение

Я бы порекомендовал прочитать это , оно немного техническое, но помогло мне понять многие вещи.

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