Разбор документа в фоновом режиме после загрузки в Flask - PullRequest
0 голосов
/ 14 апреля 2020

Я пытаюсь создать простое приложение Flask для анализа файла CSV. Я хотел бы, чтобы файл анализировался в фоновом режиме, чтобы пользователю не пришлось ждать. Я изучил многопоточность и многопроцессорность, но я не уверен, что лучший вариант.

@app.route('/', methods=['GET', 'POST'])
def upload_file():
    if request.method == 'POST':
        if 'file' not in request.files:
            flash('No file part')
            return redirect(request.url)
        file = request.files['file']
        if file.filename == '':
            flash('No selected file')
            return redirect(request.url)
        if file and allowed_file(file.filename):
            filename = secure_filename(file.filename)
            location = os.path.join(app.config['UPLOAD_FOLDER'], filename)
            file.save(location)
            parser = Parser(location)
            thread = Thread(target=parser.read_csv())
            thread.daemon = True
            thread.start()
            return redirect(url_for('uploaded_file'))
    return render_template('index.html')

Как я могу построить это таким образом, чтобы:

  • Пользователь загружает файл
  • Пользователь перенаправляется на другую страницу, пока csv анализируется в фоновом режиме?

1 Ответ

0 голосов
/ 14 апреля 2020

Спасибо за признание того, что веб-страница должна предлагать время отклика менее секунды, даже если обработка .csv может занять больше времени.

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

Вы могли бы немедленно предложить страницу со ссылкой на результаты, и надеяться, что человек предложит вам достаточно длительную интерактивную задержку, чтобы к тому времени обработка была закончена. Или сразу 302 перенаправить на такую ​​страницу.

Или получить оценку страницы результатов (из размера файла .csv), когда обработка будет завершена, и отобразить , что как "извините, вы потеряете" msgstr "страница, которая приглашает щелкнуть через минуту, когда она должна быть готова. Даже без разумной оценки вы можете просто жестко запрограммировать десятисекундные повторы.

Страница может автоматически обновить sh, опрашивая до завершения обработки. См. https://en.wikipedia.org/wiki/Meta_refresh. Вы можете адаптивно уменьшить n = 5; meta = f'content="{n}; url=/results"', чтобы n становилось меньше по мере приближения конечного размера файла результата.

Техника asyn c, такая как websockets или long-poll, позволяла вашему серверу уведомлять браузер точно тогда, когда анализируемый результат доступен, но для текущего варианта использования это звучит как перебор.

...