#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, я пытался, но спасибо за решение.