Время прочтения: 4 мин.
Часто бывает, что для анализа данных необходимо многократно выполнять одни и те же действия над исходными данными. Для примера возьмем задачу, которую решала наша команда по анализу документов различных форматов таких как docx, xlsx, pptx, jpeg, pdf и др. Для удобства последующей обработки данных было решено создать веб-приложение с понятным для пользователя интерфейсом и зашитым внутри кодом. Код Python для обработки документов был готов, и мы не будем на нем останавливаться, а расскажем о том, как решали задачу красиво его «упаковать» в небольшую программу с понятным интерфейсом. Для этого мы использовали инструмент Flask. Это микро-фреймворк со всеми средствами и библиотеками, необходимыми для создания веб-приложения на основе языка Python, его цель – решение базовых задач без излишней нагрузки на сервер. Еще одним преимуществом является то что на его изучение не потребуется много времени.
Установим Flask:
pip install flask
Создадим основной файл с именем app.py в корневом каталоге рабочей папки и пропишем базовый код для приложения:
# импортируем Flask
from flask import Flask
# создаем приложение
app = Flask(__name__)
Посредством файла app.py мы получили возможность доступа ко множеству функций библиотеки Flask, в т.ч. для отслеживания URL-адреса страницы. Для этого используется маршрутизация:
# для отслеживания URL-адреса главной страницы:
@app.route('/')
def index():
return render_template('index.html')
При переходе на главную страницу приложение будет отображать файл index.html – необходимо создать его в каталоге templates. Но сначала создадим шаблон base.html, из которого будем наследовать настройки страниц нашего приложения. В своем примере я пропишу базовую структуру без ввода дополнительных настроек:
<!doctype html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<link rel="stylesheet" href="./static/css/main.css">
<title>Приложение для обработки документов</title>
</head>
<body>
{% block body %}{% endblock %}
</body>
</html>
Вернемся к файлу главной страницы index.html. В этом и последующих файлах мы не будем прописывать структуру и настройки, а обратимся за настройками к файлу base.html. В файле index.html пропишу кратко инструкцию по работе приложения, а также кнопки, с помощью которых будут загружаться документы, запускаться модуль их обработки и выгружаться результаты.
# так настройки из файла base.html перенесутся в этот файл
{% extends 'base.html' %}
{% block body %}
<div class="title">
<h1>Приложение для обработки документов</h1>
</div>
<h3 align="center">Инструкция</h3>
<div align="center">
<table id="instruction">
<tr id="row">
<td>Краткая инструкция по использованию приложения состоит из 3 шагов:</td> </tr>
<tr id="row">
<td>1 шаг. Загрузить материалы. Добавить документы в открывшуюся папку.</td> </tr>
<tr id="row">
<td>2 шаг. Запуск модуля. Обработка документов.</td> </tr>
<tr id="row">
<td>3 шаг. Итог. Выгрузка результатов отработки модуля.</td> </tr>
</table>
</div>
<div align="center">
<p><a class="btn" href="/upload" target="_blank">Загрузить материалы</a></p>
<p><a class="btn" href="/start">Запуск</a></p>
<p><a class="btn" href="/output_data">Итог</a></p>
</div>
{% endblock %}
Мы получили главную страницу веб-приложения, которая выглядит так:
Пропишем шаблоны страниц, которые будут отображаться при нажатии кнопок с главной страницы:
Кнопка «Запуск», файл start.html
{% extends 'base.html' %}
{% block body %}
<h2 align="center">Обработка завершена. Посмотреть
<a href="/output_data">результаты.</a></h2>
{% endblock %}
Кнопка «Итог», файл output_data.html
{% extends 'base.html' %}
{% block body %}
<h1>Общая статистика</h1>
<h2><a href="/index">На главную</a></h2>
<h1>Проанализировано <b>{{count}}</b> документов.</h1>
…
<br>
<h3><a href="#">Вверх</a></h3>
<br>
{% endblock %}
Теперь вернемся к файлу app.py:
from flask import Flask, render_template, Response, request, render_template_string
app = Flask(__name__)
# главная страница
@app.route('/')
@app.route('/index')
def index():
return render_template("index.html")
# запуск обработки документов
@app.route('/start')
def start():
if # здесь ваш код обработки документов
return render_template("start.html",
start_data='Обработка завершена. Посмотреть
<a href="/output_data">результаты.</a>')
# условие, если файлы не загружены:
else:
return render_template_string('<h2 align="center">Не загружены файлы для обработки. Вернитеcь на <a href="/index">главную страницу.</a></h2>')
# вывод результатов
@app.route('/output_data')
def output():
if # здесь ваш код вывода результатов
else:
# условие, если запуск не был произведен, и пользователь пытается попасть на # страницу с результатами:
return render_template_string('<h2 align="center">Для начала надо нажать на "Запуск". Вернитеcь на <a href="/index">главную страницу.</a></h2>')
# запуск Flask-приложения:
if __name__ == "__main__":
app.run(debug=False)
Таким образом, мы познакомились с простым инструментом по созданию веб-приложений. Данный инструмент может быть интересен ИТ-специалистам, в чьи обязанности входят частые запросы коллег на выгрузку и обработку однотипных данных. Flask позволит создать красивую и понятную пользователю «упаковку» для ваших алгоритмов и кода.