К сожалению, невозможно продолжить выполнение кода после возврата ответа. Было бы намного проще, если бы вы использовали многопоточность, но если нет, вы можете обойти это во Flask, добавив вызов AJAX к вашему HTML-ответу, который отправит запрос POST на один из дополнительных маршрутов сервера, чья функция-обработчик будет желаемым кодом выполнения. после возврата ответа. Вот один из возможных подходов с использованием Flask:
myflaskapp.py
from flask import Flask, render_template_string
import time
app = Flask(__name__)
@app.route('/run', methods=['POST'])
def run():
# this is where you put your "continue execution..." code
# below code is used to test if it runs after HTTP connection close
time.sleep(8)
print('Do something')
return ''
@app.route('/')
def index():
return render_template_string('''
Hello World!
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script>
$(function() {
$.ajax({
type: "POST",
url: "{{ url_for('run') }}"
});
})
</script>
''')
if __name__ == "__main__":
app.run(host='0.0.0.0')
Вы можете запустить сервер через порт 9091 с помощью команды:
uwsgi --http 127.0.0.1:9091 --wsgi-file myflaskapp.py --callable app
Чтобы проверить, работает он или нет, вы можете перейти по адресу localhost:9091
. Если все работает хорошо, вы должны увидеть, что страница загружается немедленно, в то время как терминал будет печатать только Do something
после 8 seconds have passed
, указывая, что функция run
выполняется после закрытия HTTP-соединения.