Учебное Пособие По Flask Mega, Часть 18. Развертывание В Облаке Heroku

Это восемнадцатая статья в серии, в которой я описываю свой опыт написания веб-приложения на Питон использование микрофреймворка Колба .

Целью этого урока является разработка достаточно функционального приложения для микроблогов, которое из-за полного отсутствия оригинальности я решил назвать микроблогом.

Оглавление Часть 1: Привет, мир! Часть 2: Шаблоны Часть 3: Формы Часть 4: База данных Часть 5: Вход пользователя Часть 6: Страница профиля и аватары Часть 7. Модульное тестирование Часть 8: Последователи, контакты и друзья Часть 9: Нумерация страниц Часть 10. Полнотекстовый поиск Часть 11. Поддержка по электронной почте Часть 12: Реконструкция Часть 13: Дата и время Часть 14: I18n и L10n Часть 15: Аякс Часть 16. Отладка, тестирование и профилирование Часть 17. Развертывание в Linux (и даже в Raspberry Pi!) Часть 18. Развертывание в облаке Heroku (эта статья) В предыдущей статье мы рассмотрели вариант традиционного хостинга.

Мы видели два текущих примера хостинга на серверах Linux: сначала на обычном сервере под управлением CentOS, а затем на мини-компьютере Raspberry Pi. Те читатели, которые раньше не администрировали системы Linux, возможно, решили, что это требует слишком много усилий и может быть реализовано более простым способом.

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

Но что означает «развертывание в облаке»? Поставщики облачного хостинга предлагают платформу, на которой можно запустить наше приложение.

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

Звучит слишком хорошо, чтобы быть правдой, не так ли? Мы рассмотрим развертывание приложения на платформе.

Хероку , одна из самых популярных платформ облачного хостинга.

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

Если вы хотите узнать больше об этом типе услуг и о том, что предлагают другие провайдеры, вы можете посетить страницу Википедии по адресу ПааС .



Хостинг на Heroku

Heroku была одной из первых платформ, предоставляющих услуги PaaS. Вначале он предлагал услуги хостинга только для приложений Ruby, но позже включил поддержку многих других языков, таких как Java, Node.js и наш любимый Python. Фактически, чтобы развернуть приложение на Heroku, все, что вам нужно сделать, это загрузить приложение с помощью git (очень скоро вы увидите, как это работает).

Heroku ищет Procfile в корневой папке приложения для получения инструкций о том, как приложение должно запускаться.

Для проектов Python Heroku также ожидает увидеть файл require.txt, содержащий список необходимых сторонних пакетов.

После скачивания приложения можно считать, что оно выполнено.

Heroku сотворит чудеса, и приложение будет подключено к сети за считанные секунды.

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

Готовы попробовать Heroku? Давайте начнем!

Создание учетной записи Heroku

Прежде чем вы сможете разместить свое приложение на Heroku, вам необходимо зарегистрироваться там.

Так что иди в связь и создайте учетную запись.

После входа в систему вы попадете в панель управления, откуда сможете управлять всеми своими приложениями.

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



Установка клиента Heroku

Несмотря на то, что некоторые задачи можно выполнить прямо из веб-интерфейса, есть задачи, которые можно решить только из терминала, поэтому будем делать всё в консоли.

Heroku предлагает утилиту «Клиент Heroku», которую мы будем использовать для создания нашего приложения и управления им.

Эту утилиту можно запустить под Windows, Mac OS X и Linux. Если доступно для вашей платформы Инструментарий Героку тогда это самый простой способ установить клиент Heroku. Первое, что мы сделаем с помощью клиента, это войдем в нашу учетную запись:

  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
   

$ heroku login

Heroku запросит у вас адрес электронной почты и пароль для вашей учетной записи.

Когда вы впервые войдете в систему, клиент отправит ваш ssh-ключ на сервер Heroku. Последующие команды могут выполняться без авторизации.



Настройка Git

git — основа для развертывания приложений на Heroku, поэтому его тоже необходимо установить.

Если вы установили набор инструментов Heroku, значит, у вас уже установлен git. Чтобы развернуть приложение на Heroku, оно должно присутствовать в локальном репозитории, поэтому выполните в консоли следующие команды:

$ git clone git://github.com/miguelgrinberg/microblog.git $ cd microblog



Создание приложения Heroku

Чтобы создать новое приложение Heroku, просто вызовите команду создания из корневой папки приложения:

$ heroku create flask-microblog Creating flask-microblog. done, stack is cedar http://flask-microblog.herokuapp.com/ | git@heroku. com:flask-microblog.git

Помимо настроек URL, эта команда добавляет в наш репозиторий удаленный репозиторий ( git удаленный ), который мы скоро будем использовать для загрузки кода приложения в облако.

Естественно, название flask-microblog теперь взято мной, поэтому придумайте какое-нибудь другое название для своего приложения.



Устраните локальное хранилище файлов

Некоторые функции нашего приложения сохраняют информацию в виде файлов на диске.

И здесь перед нами стоит непростая задача.

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

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

Это действительно плохая новость для нас.

Во-первых, это означает, что мы не сможем использовать sqlite в качестве базы данных.

Наша база данных полнотекстового поиска Whoosh также перестанет работать, поскольку хранит данные в виде файлов.

Третий проблемный момент — наша система журналирования.

Мы сохранили наш лог в папке /tmp и теперь при работе на Heroku это тоже перестанет работать.

Итак, мы выделили 3 основные проблемы, для которых нужно искать решения.

Первую проблему мы решим, перейдя на базу данных, предлагаемую Heroku, основанную на PostgreSQL .

Готовой альтернативы для полнотекстового поиска у нас нет. Нам придется реализовать полнотекстовый поиск с использованием функционала PostgreSQL, но для этого потребуются изменения в нашем приложении.

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

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

Создание базы данных Heroku

Для создания базы данных мы используем клиент Heroku:

$ heroku addons:add heroku-postgresql:dev Adding heroku-postgresql:dev on flask-microblog. done, v3 (free) Attached as HEROKU_POSTGRESQL_ORANGE_URL Database has been created and is available ! This database is empty. If upgrading, you can transfer ! data from another database with pgbackups:restore. Use `heroku addons:docs heroku-postgresql:dev` to view documentation.

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

А откуда наше приложение знает параметры подключения к базе данных? Heroku помещает URI базы данных в переменную среды $DATABASE_URL. Если помните, в прошлой статье мы внесли изменения в наш конфигурационный файл, в т.ч.

значение этой переменной будет использоваться для подключения к базе данных по мере необходимости.



Отключить полнотекстовый поиск

Чтобы отключить полнотекстовый поиск, наше приложение должно иметь возможность определять, работает оно на Heroku или нет. Для этого мы создадим пользовательскую переменную среды, снова используя клиент Heroku:

heroku config:set HEROKU=1

Теперь для переменной среды HEROKU будет установлено значение 1, когда наше приложение работает на виртуальной платформе Heroku. Теперь отключить полнотекстовый поиск довольно просто.

Сначала добавим переменную в файл конфигурации (файл config.py):

# Whoosh does not work on Heroku WHOOSH_ENABLED = os.environ.get('HEROKU') is None

Далее отменим создание базы полнотекстового поиска (файл app/models.py):

from config import WHOOSH_ENABLED if WHOOSH_ENABLED: import flask.ext.whooshalchemy as whooshalchemy whooshalchemy.whoosh_index(app, Post)

Мы также добавим информацию о полнотекстовом поиске в g в наш обработчик before_request, чтобы наши шаблоны могли ее видеть (файл app/views.py):

from config import WHOOSH_ENABLED @app.before_request def before_request(): g.user = current_user if g.user.is_authenticated(): g.user.last_seen = datetime.utcnow() db.session.add(g.user) db.session.commit() g.search_form = SearchForm() g.locale = get_locale() g.search_enabled = WHOOSH_ENABLED

И наконец, удалим поле поиска в базовом шаблоне (файл app/templates/base.html):

{% if g.user.is_authenticated() and g.search_enabled %} <form class="navbar-search pull-right" action="{{url_for('search')}}" method="post" name="search">{{g.search_form.hidden_tag()}}{{g.search_form.search(size=20,placeholder=_('Search'),class="search-query")}}</form> {% endif %}



Исправление ведения журнала

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

Поэтому на этой платформе нам следует отключить ведение журнала в файлах и вместо этого использовать логгер, который записывает ошибки непосредственно в стандартный вывод (файл app/__init__.py):

if not app.debug and os.environ.get('HEROKU') is None: import logging from logging.handlers import RotatingFileHandler file_handler = RotatingFileHandler('tmp/microblog.log', 'a', 1 * 1024 * 1024, 10) file_handler.setLevel(logging.INFO) file_handler.setFormatter(logging.Formatter('%(asctime)s %(levelname)s: %(message)s [in %(pathname)s:%(lineno)d]')) app.logger.addHandler(file_handler) app.logger.setLevel(logging.INFO) app.logger.info('microblog startup') if os.environ.get('HEROKU') is not None: import logging stream_handler = logging.StreamHandler() app.logger.addHandler(stream_handler) app.logger.setLevel(logging.INFO) app.logger.info('microblog startup')



веб сервер

Heroku не предоставляет собственный веб-сервер.

Вместо этого он ожидает, что приложение запустит собственный сервер с номером порта, полученным из переменной среды $PORT. Мы знаем, что сервер разработки Flask не подходит для производства, поскольку он однопроцессный и однопоточный, поэтому нам нужно лучшее решение.

Руководство Heroku для приложений Python рекомендует пушка , мы будем использовать его.

В нашей локальной среде Gunicorn устанавливается как обычный модуль Python:

$ flask/bin/pip install gunicorn

Чтобы запустить его, мы должны передать один аргумент с именем модуля Python, определяющего приложение, и самого объекта приложения, разделенных двоеточием.

Давайте создадим отдельный модуль Python для Heroku (файл runp-heroku.py):

#!flask/bin/python from app import app

Теперь, например, если мы хотим запустить сервер Gunicorn локально с помощью этого модуля, нам нужно выполнить следующую команду:

$ flask/bin/gunicorn runp-heroku:app 2013-04-24 08:42:34 [31296] [INFO] Starting gunicorn 0.17.2 2013-04-24 08:42:34 [31296] [INFO] Listening at: http://127.0.0.1:8000 (31296) 2013-04-24 08:42:34 [31296] [INFO] Using worker: sync 2013-04-24 08:42:34 [31301] [INFO] Booting worker with pid: 31301



Файл требований.

txt

Очень скоро мы загрузим наше приложение в Heroku, но сначала нам нужно сообщить серверу, какие модули должно запускать наше приложение.

На нашем локальном ПК мы управляли зависимостями с помощью виртуальной среды, устанавливая в нее модули с помощью pip. Heroku делает то же самое.

Если файл require.txt найден в корневой папке приложения, то Heroku устанавливает все перечисленные в нем модули с помощью pip. Чтобы создать файл требований.

txt, мы должны использовать опцию заморозки при вызове pip:

$ flask/bin/pip freeze > requirements.txt

В список необходимо добавить сервер Gunicorn, а также драйвер psycopg2, который необходим SQLAlchemy для подключения к базе данных PostgreSQL. Окончательный файл требований.

txt будет выглядеть так:

Babel==0.9.6 Flask==0.9 Flask-Babel==0.8 Flask-Login==0.1.3 Flask-Mail==0.8.2 Flask-OpenID==1.1.1 Flask-SQLAlchemy==0.16 Flask-WTF==0.8.3 git+ git://github.com/miguelgrinberg/Flask-WhooshAlchemy Jinja2==2.6 MySQL-python==1.2.4 psycopg2==2.5 SQLAlchemy==0.7.9 Tempita==0.5.1 WTForms==1.0.3 Werkzeug==0.8.3 Whoosh==2.4.1 blinker==1.2 coverage==3.6 decorator==3.4.0 flup==1.0.3.dev-20110405 guess-language==0.2 gunicorn==0.17.2 python-openid==2.2.5 pytz==2013b speaklater==1.3 sqlalchemy-migrate==0.7.2

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

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



Прокфайл

Последнее требование — сообщить Heroku, как запускать приложение.

Для этого Heroku требуется Procfile в корневой папке приложения.

Этот файл довольно прост, он просто определяет имена процессов и связанные с ними команды (Procfile):

web: gunicorn runp-heroku:app init: python db_create.py && pybabel compile -d app/translations upgrade: python db_upgrade.py && pybabel compile -d app/translations

Веб-метка связана с веб-сервером.

Heroku требуется это задание для запуска нашего приложения.

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

Задача init инициализирует наше приложение, создавая базу данных и компилируя языковые файлы.

Задание обновления похоже на задание init, но вместо создания базы данных оно обновляет базу данных до последней версии миграции.



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

Теперь мы подошли к самой интересной части: мы разместим приложение в нашей учетной записи Heroku. Это довольно просто, мы просто используем git для отправки приложения:

$ git push heroku master Counting objects: 307, done. Delta compression using up to 4 threads. Compressing objects: 100% (168/168), done. Writing objects: 100% (307/307), 165.57 KiB, done. Total 307 (delta 142), reused 272 (delta 122) -----> Python app detected -----> No runtime.txt provided; assuming python-2.7.4. -----> Preparing Python runtime (python-2.7.4) -----> Installing Distribute (0.6.36) -----> Installing Pip (1.3.1) -----> Installing dependencies using Pip (1.3.1) .

-----> Discovering process types Procfile declares types -> init, upgrade, web -----> Compiled slug size: 29.6MB -----> Launching. done, v6 http://flask-microblog.herokuapp.com deployed to Heroku To git@heroku. com:flask-microblog.git * [new branch] master -> master

Тег Heroku, который мы используем в нашей команде git push, был автоматически зарегистрирован в нашем репозитории git, когда мы создавали приложение с помощью Heroku create. Чтобы увидеть, как настроен этот удаленный репозиторий, вы можете запустить git Remote -v в папке приложения.

Когда мы первоначально загружаем приложение в Heroku, нам необходимо инициализировать базу данных и файлы перевода, и для этого мы должны запустить задачу инициализации, которую мы включили в наш Procfile:

$ heroku run init Running `init` attached to terminal. up, run.7671 /app/.

heroku/python/lib/python2.7/site-packages/sqlalchemy/engine/url. py:105 : SADeprecationWarning: The SQLAlchemy PostgreSQL dialect has been renamed from 'postgres' to 'postgresql'.

The new URL format is postgresql[+driver]://<user>:<pass>@<host>/<dbname> module = __import__('sqlalchemy.dialects.%s' % (dialect, )).

dialects compiling catalog 'app/translations/es/LC_MESSAGES/messages.po' to 'app/translations/es/LC_MESSAGES/messages.mo'

Предупреждение принадлежит SQLAlchemy, поскольку ей не нравятся URI, начинающиеся с postgres:// вместо postgresql://.

Этот URI генерируется Heroku посредством значения переменной среды $DATABASE_URL, поэтому мы не можем его изменить.

Будем надеяться, что этот формат URI будет работать еще долго.

Хотите верьте, хотите нет, но наше приложение уже доступно онлайн.

В моем случае приложение доступно по адресу flask-microblog.herokuapp.com .

Вы вполне можете стать моим подписчиком со страницы мой профайл .

Я точно не знаю, как долго приложение будет доступно по этому адресу, но ничто не мешает вам проверить, доступно оно или нет!

Обновление приложения

Рано или поздно придет время обновить наше приложение.

Это будет похоже на первоначальное развертывание.

Первым делом приложение будет загружено на сервер с помощью git:

$ git push heroku master

Затем был выполнен скрипт обновления:

$ heroku run upgrade



Ведение журнала

Если с приложением происходит что-то необычное, возможно, будет полезно изучить логи.

Помните, что для версии приложения Heroku мы записываем все логи на стандартный вывод, а Heroku собирает их в свой собственный журнал.

Для просмотра логов используйте клиент Heroku:

$ heroku logs

Приведенная выше команда выведет все журналы, включая журналы Heroku. Чтобы просмотреть журналы только вашего приложения, выполните команду:

$ heroku logs --source app

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



Стоит ли оно того?

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

Когда дело доходит до простоты, победа витает в облаках.

По крайней мере, для Heroku процесс развертывания приложения был очень простым.

При развертывании на выделенном сервере или VPS нужно было проделать большую подготовительную работу.

Heroku позаботится об этом и позволит нам сосредоточиться на нашем приложении.

Вопрос стоимости является спорным моментом.

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

Типичный план Heroku, включающий два экземпляра и самую дешевую производственную базу данных, будет стоить 85 долларов (на момент написания статьи).

Около года назад – ок.

переулок ).

С другой стороны, если поискать достаточно внимательно, вы легко сможете найти приличный VPS примерно за 40 долларов в год. В конце концов, мне кажется, вопрос выбора сведется к выбору того, что для вас важнее: время или деньги.



Конец?

Обновленное приложение доступно, как всегда, на github .

Или вы можете скачать его в виде zip-архива по ссылке: Скачать микроблог 0.18 .

Развернув наше приложение всеми возможными способами, похоже, наша экскурсия подходит к концу.

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

Если и когда на ум придет интересная тема, я напишу еще, но ожидаю, что частота обновлений теперь несколько снизится.

Время от времени я могу вносить в приложение небольшие исправления, которые не заслуживают отдельного поста в блоге, поэтому вы можете внести следующие изменения: отслеживать на GitHub .

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

Я приглашаю вас следовать за мной Твиттер или Фейсбук , если вы еще этого не сделали, и таким образом вы будете получать уведомления о моих последующих статьях.

Еще раз спасибо за то, что вы являетесь постоянным читателем.

Мигель Теги: #python #flask #веб-разработка #развертывание #heroku #разработка веб-сайтов #python #flask

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.