Проблемы развертывания

Новички часто устанавливают все пакеты на системном уровне из-за отсутствия опыта (например, с помощью pip). Получение зависимостей из requirements.txt для каждого проекта создаёт на компьютере неуправляемую глобальную среду Python. Виртуальные среды позволяют разделить ПО на отдельные части, сохраняя при этом список зависимостей.

Pipenv помогает разработчикам писать изолированные программные продукты, которые легче развертывать, создавать и изменять.

Что такое Pipenv?

Pipenv объединяет управление пакетами и виртуальной средой в один инструмент дляуправленияими. Pipenv  —  это pip и virtualenv, обёрнутые воедино.

Что такое Heroku?

Это множество программных продуктов, но нам понадобится только сервис облачной платформы Heroku для размещения приложения и JawsDB для БД MySQL. Он бесплатен! Воспользуемся GUI Heroku.

Преимущества облачной БД

При использовании SQLite каждая передислокация приложения приводит к сбросу БД. JawsDB Heroku позволяет данным сохраняться через обновления приложений. Размещение, настройка, исправление и управление БД  —  это всё JawsDB.

Подготовка к развёртыванию

Heroku дает возможность развернуть приложение из ветки Github. Как только у нас будет работающее приложение с Pipfile на Github, мы внесём окончательные изменения в репозиторий для развёртывания. Убедитесь, что у вас есть Pipfile в корневой директории проекта, чтобы Heroku мог найти его.

Примечание: следующие изменения позволяют приложению работать в Unix. Gunicorn не работает на ПК c Windows.

Установка gunicorn

Gunicorn  —  это HTTP-сервер WSGI Python, который будет обслуживать приложение Flask на Heroku. Добавьте gunicorn в Pipfile:

pipenv install gunicorn

Добавление Procfile

Создайте файл Procfile в корневой папке проекта и добавьте:

web: gunicorn app:app

Первое app  —  имя python-файла, который запускает приложение, или имя модуля, в котором оно находится. Второе app  —  имя приложения, то естьapp.py. Этот Procfile работает с gunicorn и Dynos Heroku, чтобы обслуживать приложение удаленно.

Настройка и развертывание облачной БД Heroku Cloud

Всё, что касается Heroku в этой статье,  —  бесплатно. Создайте там учетную запись.

Перейдите в приложение на Heroku.com и нажмите кнопку resources. Затем введите “Jawsdb MySQL” в поле addons, как показано ниже:

Выберите бесплатную версию и нажмите кнопку provision. Отлично, теперь БД MySQL развёрнута для приложения. Затем нужно интегрировать новую БД в его логику.

Добавим pymysql, библиотеку Python SQL, в Pipfile:

pipenv install pymysql

Изменим строку подключения к pymysql. В настройках взгляните на переменные конфигурации. Найдите строку подключения, вроде этой:

mysql://ael7qci22z1qwer:nn9keetiyertrwdf@c584asdfgjnm02sk.cbetxkdfhwsb.us-east-1.rds.amazonaws.com:3306/fq14casdf1rb3y3n

Чтобы воспользоваться драйвером Pymysql в БД нужно внести изменения. С помощью текстового редактора, измените mysql на mysql+pymysql и сохраните:

mysql+pymysql://ael7qci22z1qwer:nn9keetiyertrwdf@c584asdfgjnm02sk.cbetxkdfhwsb.us-east-1.rds.amazonaws.com:3306/fq14casdf1rb3y3n

Нужно будет добавить строку к переменным конфигурации на Heroku. Перейдите в настройки, затем в переменные конфигурации (config vars) и обновите строку подключения.

Сокрытие строк подключения с .env

Создайте новый файл с именем .env и добавьте строку подключения для облачной БД:

DB_CONN=”mysql+pymysql://root:PASSWORD@HOSTNAME:3306/records_db”

Примечание: запуск pipenv shell дает доступ к скрытым переменным среды. Также к ним можно получить доступ в Python с помощью os.

SQLALCHEMY_DB_URL = os.getenv(“DB_CONN”)

Для подключения к облаку обязательно добавьте строку выше в database.py!

Развертывание приложения

После тестирования и локальной работы отправляем весь код в ветку master (главную ветку). На Heroku переходим к развертыванию нового приложения (deploy a new app) и видим страницу:

Выбор Github и поиск вашего репозитория

Потом выберите Github, введите имя репозитория и нажмите кнопку search. Как только появится ваше имя пользователя и репозиторий, выберите connect. Щелкните на нужной ветке и нажмите deploy (развернуть).

Выбор главной ветки и развертывание

Логи сборки начнут заполнять консоль. Сначала Heroku ищет файл requirements.txt, а затем устанавливает зависимости из Pipfile.lock Pipenv. Вам понадобятся requirements.txt, если вы не используете Pipenv. Поместите эти файлы в корневой каталог проекта.

Как только из Pipfile.lock будет построена среда и сборка пройдет успешно, вы увидите:

Успешная развертывание приложения

Приложение развёрнуто. Нажмите кнопку view, чтобы увидеть его на Heroku.

Построение таблиц при инициализации

Если таблицы не были созданы до того, как вы попытались получить или опубликовать данные, то можно столкнуться с ошибкой. Для решения в app.py добавим:

@app.before_first_request
def setup():
     db.create_all()

Автоматическое развертывание

Чтобы изменения в ветке master на Github отображались на Heroku по мере их отправки, можно выбрать эту опцию (ветка master должна работать).

Разрешение автоматического развертывания

Вывод

Мы рассмотрели Github как инструмент контроля версий, Pipenv как среду и менеджер пакетов, а также преимущества управления БД через облако. Это упрощает сборку ПО, разработчики вместо управления сосредоточиваются на коде.

Практика правильного управления средой и пакетами имеет значение для специалистов по обработке данных и разработчиков, которые хотят, чтобы с их кодом работали. Использование среды и менеджера пакетов, такого как Pipenv, делает многие процессы эффективными!

Наличие хорошо управляемой главной ветки Github с Pipfile позволило Heroku пересобрать проект с минимальной диагностикой. Развернуть приложение из каталога на Github в Heroku можно за считанные минуты. Спасибо за чтение!

Читайте также:

Читайте нас в Telegram, VK и Яндекс.Дзен


Перевод статьи Edward Krueger: Deploy a Flask App on Heroku and Connect it to a JawsDB-MySQL Database

Предыдущая статьяЗамыкания в Rust
Следующая статья4 шага к совершенству: правила для идеальных функций