Flask - обнаружение завершения работы функции и визуальное указание пользователю - PullRequest
1 голос
/ 24 апреля 2019

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

@app.route('/run_probe', methods=['POST'])
def run_probe():
    if request.method == 'POST':
        input_directory = request.form['directory']

        if os.path.isdir(input_directory):
            files = get_file_list.probe(input_directory)
            return render_template('index.html', files=files)

        else:
            flash('Could not probe directory')
            return redirect(url_for('index'))

Это позволяет пользователю войти в каталог /filepath в <input>, затем сканирует каталог и возвращает список filepath.Но это нужно закончить, чтобы пользователь мог пойти куда-либо еще.

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

Я думал вместо того, чтобы напрямую возвращать список, отправлять вывод на mongodb для последующего поиска, но если я нажму run, ему все равно нужно сделать os.walk(), прежде чем позволить мне продолжить.

1 Ответ

2 голосов
/ 24 апреля 2019

Для этого вам может понадобиться Javascript:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<script>
const Url="http://host:port/to/your/time/consumming_function";
$("#button").on('click', function() {
    $.ajax({
        type:'GET',
        url = Url,
        success: function(data) {
            //Update your document here or redirect
        }
    )}
    return false; //Avoid auto reloading
}
</script>

Основная идея - Ajax запросит ваше приложение Flask. Затем он вызовет функцию в success , когда он закончится. В этот момент обновите контент или перенаправьте пользователя. Пользователь сможет продолжить работу на той же веб-странице, пока еще выполняется запрос ajax.

Я просто хочу предупредить вас, что вы можете получить ошибку тайм-аута, если ваша задача слишком длинная. Вы можете указать время ожидания.

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