Возможно ли выполнить функцию после оператора return в flask?

#python #flask

#python #flask

Вопрос:

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

 from flask import Flask, render_template, request, url_for, redirect, session
app = Flask(__name__)

@app.route('/', methods=["POST", "GET"])
def index():
   my_function():
      """
      execute codde
      """
   my_function()
   return render_template('index.html')
 

Я хочу запустить что-то вроде этого:

 @app.route('/', methods=["POST", "GET"])
def index():
   my_function():
      """
      execute codde
      """
 return render_template('index.html')  
 my_function()
   
 

myFunction Находится на той же странице и работает отлично.
Очевидно, что это невозможно, но я просто хочу знать, как return render_template('index.html') сначала, а затем вызвать функцию?

Комментарии:

1. По сути, вы хотите вернуться из функции, но на самом деле это не так, я прав?

2. Похоже, вы хотите запустить асинхронную функцию.

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

4. Вы имели в виду: ret = render_template('index.html'); my_function(); return ret ?

5. @quamrana, я хочу вернуть шаблон рендеринга, а затем выполнить функцию

Ответ №1:

flask-executor предоставляет простой способ сделать это.

В вашем случае это может выглядеть так:

 from flask import Flask, render_template, request, url_for, redirect, session

app = Flask(__name__)
executor = Executor(app)

@app.route('/', methods=["POST", "GET"])
def index():
    executor.submit(my_function)
    return render_template('index.html')
 

my_function будет выполняться асинхронно и index продолжит выполняться немедленно, позволяя вам ответить на запрос путем рендеринга шаблона, не дожидаясь my_function завершения выполнения.

Если вам нужны дополнительные гарантии, такие как масштабируемость (задачи могут выполняться на других компьютерах) или надежность (задачи все равно выполняются, если веб-сервер умирает), вы могли бы изучить что-то вроде Celery или RQ. Эти инструменты являются мощными, но обычно требуют гораздо большей настройки flask-executor , чем в приведенном выше примере.

Комментарии:

1. Я продолжаю получать эту ошибку: TypeError: Executor() не принимает аргументов

Ответ №2:

Вы можете «дать» это.

 from flask import Flask, render_template, request, url_for, redirect, session
app = Flask(__name__)

@app.route('/', methods=["POST", "GET"])
def index():
   my_function():
      """
      execute codde
      """
   yield render_template('index.html')
   my_function()
 

Таким образом, функция «возвращает» что-то, но не останавливается и вызывает функцию «my_function» и весь код после этого.

Для получения дополнительной информации я предлагаю ЭТУ ССЫЛКУ из GeekForGeek

Комментарии:

1. Я не уверен yield , что делает то, что вы думаете. Это, безусловно, преобразует функцию в генератор. Я не знаю flask , знает ли он о генераторах.

2. @quamrana, yield не работает с flask, я пытался, но спасибо за решение.