Flask приложение - деплоймент в облачный хостинг

avm

Опубликован:  2018-02-11T07:07:34.546703Z
Отредактирован:  2018-02-11T07:05:57.262137Z
1200
Пошаговая инструкция для развёртывания Flask приложения в облачном хостинге на базе Python3.5 и Sqlite3. Ниже представлено полное описание необходимых и достаточных действий для запуска web-приложения в сети Интернет в домене третьего уровня на бесплатном аккаунте сервиса pythonanywhere.com.

1. Исходное Flask приложение и план действий

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

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

  • зарегистрировать бесплатный аккаунт на pythonanywhere.com;
  • войти в сервис и запустить bash консоль;
  • скопировать исходный код приложения на pythonanywhere.com;
  • установить виртуальное окружение и необходимые для запуска приложения зависимости;
  • правильно сконфигурировать приложение и настроить базу данных;
  • зарегистрировать в базе данных суперпользователя и создать для него пароль;
  • интегрировать приложение в сервис pythonanywhere.com и запустить его.

Пожалуй приступим...

2. Регистрация бесплатного аккаунта на pythonanywhere.com

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

pythonanywhere.com main page

Нахожу на главной странице ссылку Pricing & signup, на скриншоте выше указатель мыши наведён на эту ссылку, следую по ней:

pythonanywhere.com create acc

На этой странице нахожу ссылку Create a Beginner account, следую по ней, заполняю форму и нажимаю кнопку Register:

pythonanywhere.com register form

Если форма заполнена верно и верифицирована системой, то в результате я окажусь на странице неподтверждённого e-mail адреса:

pythonanywhere.com unconfirmed

Иду на почту, нахожу полученное от pythonanywhere.com письмо:

pythonanywhere.com confirm mail

нахожу в нём ссылку для подтверждения e-mail адреса:

pythonanywhere.com confirmation link

и следую по этой ссылке:

pythonanywhere.com confirmed e-mail

В результате я оказываюсь в сервисе и получаю доступ к его интерфейсу:

pythonanywhere.com user interface

3. Ключевые ссылки интерфейса pythonanywhere.com

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

Первая ключевая ссылка - Dashboard:

pythonanywhere.com dashboard link

Ссылка Dashboard ведёт на вкладку Consoles, на этой вкладке находится вторая ключевая ссылка Bash, которая предоставляет интерактивную консоль bash:

pythonanywhere.com bash link

Третья ключевая ссылка - Web ведёт на одноименную вкладку, на которой можно управлять пользовательскими приложениями:

pythonanywhere.com web link

Все три ключевые ссылки понадобятся далее...

4. Копирование исходного кода приложения на pythonanywhere.com

В интерфейсе сервиса следую по ключевой ссылке Bash (см. п. 3 этого описания), которая предоставляет интерактивную сессию bash-консоли, полностью аналогичную bash-консоли Linux:

pythonanywhere.com bash

Создаю в этой консоли новый каталог и захожу в него:

pythonanywhere.com bash

Получаю с github.com исходный код развёртываемого приложения, для этого в консоли сервиса вбиваю команду:

$ git clone https://github.com/tgi-f/linker.git

pythonanywhere.com git clone

Захожу в каталог скопированного репозитория, для этого в консоли сервиса вбиваю команду:
cd linker

pythonanywhere.com cd linker

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

5. Установка виртуального окружения и зависимостей приложения

Виртуальное окружение в сервисе pythonanywhere.com устанавливается командой:

$ mkvirtualenv --python=/usr/bin/python3.5 venv

pythonanywhere.com mkvirtualenv

Следует отметить, что виртуальное окружение в pythonanywhere.com всегда устанавливается в каталог .virtualenvs домашнего каталога пользователя и при создании нового виртуального окружения, созданное окружение автоматически активируется, то есть приглашение командной строки в консоли получает префикс с именем активного виртуального окружения.

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

$ pip install -r requirements.txt 

и дожидаюсь установки всех требуемых пакетов.

pythonanywhere.com requirements

В результате успешной установки система выдаст следующее сообщение:

Successfully installed Flask-0.11.1 Flask-Login-0.4.0 Flask-Migrate-2.0.0 Flask-Moment-0.5.1 
Flask-SQLAlchemy-2.1 Flask-Script-2.0.5 Flask-WTF-0.13.1 Jinja2-2.8 Mako-1.0.4 MarkupSafe-0.2
3 SQLAlchemy-1.1.3 WTForms-2.1 Werkzeug-0.11.11 alembic-0.8.8 click-6.6 itsdangerous-0.24 ord
ereddict-1.1 python-editor-1.0.1
(venv) 06:20 ~/workspace/linker (master)$ 

На что следует обратить внимание:

  • установленное виртуальное окружение использует интерпретатор Python3.5, это следует из команды, которой виртуальное окружение создавалось, а именно mkvirtualenv --python=/usr/bin/python3.5 venv;
  • абсолютный путь к виртуальному окружению - /home/elr/.virtualenvs/venv/, в нём elr - имя активного пользователя, venv имя созданного виртуального окружения, этот адрес мне потребуется далее.

Ну и чтобы продолжить я почищу консоль командой reset:

pythonanywhere.com reset

6. Конфигурация приложения и установка базы данных

Из коробки репозиторий рассматриваемого приложения не содержит файл конфигурации, но содержит шаблон для его создания. Чтобы создать файл конфигурации, просто копирую этот шаблон в файл с именем config.py, для этого вбиваю в консоль pythonanywhere.com команду:

$ cp config.back config.py

Затем запускаю консольный текстовый редактор nano командой:

$ nano config.py

pythonanywhere.com nano

и привожу этот файл к следующему виду:

import os

from datetime import timedelta

basedir = os.path.realpath(os.path.dirname(__file__))


class Config:
    SECRET_KEY = 'opFVYd=QD@69PyG!32ERkWOo!3UwTKB2Ehzrn_O25&%HWOc=NI'
    PERMANENT_SESSION_LIFETIME = timedelta(hours=4)
    SQLALCHEMY_COMMIT_ON_TEARDOWN = True
    SQLALCHEMY_TRACK_MODIFICATIONS = False
    LINKS_PER_PAGE = 50
    USERS_PER_PAGE = 30

    @staticmethod
    def init_app(app):
        pass


class Development(Config):
    DEBUG = True
    SESSION_PROTECTION = None
    SQLALCHEMY_DATABASE_URI = 'sqlite:///' + \
                              os.path.join(basedir, 'linker.dev.sqlite')
    LINKS_PER_PAGE = 3
    USERS_PER_PAGE = 3


class Testing(Config):
    TESTING = True
    WTF_CSRF_ENABLED = False
    SERVER_NAME = 'localhost'
    SQLALCHEMY_DATABASE_URI = 'sqlite:///:memory:'
    LINKS_PER_PAGE = 3
    USERS_PER_PAGE = 3


class Production(Config):
    SESSION_PROTECTION = 'basic'
    SQLALCHEMY_DATABASE_URI = 'sqlite:///' +\
                              os.path.join(basedir, 'linker.sqlite')


config = {
    'development': Development,
    'testing': Testing,
    'production': Production,
    'default': Production
}

Сохраняю файл сочетанием ctrl-o и выхожу из текстового редактора сочетанием ctrl-x.

Далее мне потребуется создать базу данных, напомню, исходное приложение использует Sqlite3 - для бесплатного аккаунта pythonanywhere.com оптимальный вариант. Для создания базы данных вбиваю в консоль команду:

$ python manage.py db upgrade

pythonanywhere.com db upgrade

Если всё сделал правильно, то в текущем каталоге появится файл базы данных linker.sqlite:

(venv) 07:07 ~/workspace/linker (master)$ ls -1
README.md
__pycache__
config.back
config.py
linker
linker.sqlite   # файл базы данных
manage.py
migrations
requirements.txt
tests

7. Регистрация суперпользователя приложения

Наличие зарегистрированного аккаунта суперпользователя позволит в дальнейшем войти в уже развёрнутый сервис и воспользоваться его функциональными возможностями. Создать суперпользователя можно командой:

$ python manage.py create_superuser

pythonanywhere.com superuser

Суперпользователю необходимо задать имя и пароль для входа в сервис. При вводе пароль не будет отображаться на экране.

Это последнее действие в консоли, остальные настройки будут производиться на вкладке Web (см. п.3 этого описания). Чтобы закрыть текущую консоль bash достаточно деактивировать виртуальное окружение командой deactivate и завершить сессию командой exit.

pythonanywhere console end

В дальнейшем, чтобы повторно активировать виртуальное окружение, если это потребуется, достаточно будет ввести в консоли bash команду:

$ source ~/.virtualenvs/venv/bin/activate

8. Интеграция приложения в сервисе pythonanywhere.com

Для интеграции приложения в сервисе pythonanywhere.com достаточно перейти на вкладку Web (см. п.3 этого описания), для этого нужно перейти по ссылке Dashboard, а затем перейти на вкладку Web.

pythonanywhere.com web

Нахожу ссылку Add a new web app и перехожу по ней, в модальном окне выбираю Next.:

pythonanywhere.com web next

В новом модальном окне выбираю Manual configuration:

pythonanywhere.com manual

Далее выбираю нужную версию Питона, Python3.5:

pythonanywhere.com version

и в последнем модальном окне выбираю Next:

pythonanywhere.com next

Дожидаюсь автоматического обновления страницы:

pythonanywhere.com ready

Все остальные настройки буду производить на этой странице сервиса.

9. Настройка приложения в сервисе pythonanywhere.com

Нахожу на странице приложения блок Code.

pythonanywhere.com code

В этом блоке нахожу ссылку Enter the path to your web app source code, следую по ней, заполняю форму, вбиваю адрес каталога приложения и кликаю по кнопке с галочкой:

pythonanywhere.com app dir

Затем следую по ссылке Working directory, совершаю аналогичные действия:

pythonanywhere.com app dir

Далее нахожу блок Virtualenv и в нём следую по ссылке Enter path to a virtualenv, if desired:

pythonanywhere.com venv

Заполняю форму и сохраняю, кликнув по синей кнопке с галочкой:

pythonanywhere.com venv

Нахожу блок Static files и следую по ссылке Enter path:

pythonanywhere.com static

Вбиваю в форму адрес каталога со статикой /home/elr/workspace/linker/linker/static и сохраняю синей кнопкой с галочкой:

pythonanywhere.com static

Возвращаюсь в блок Code:

pythonanywhere.com code

Нахожу в нём ссылку /var/www/elr_pythonanywhere_com_wsgi.py, следую по ней и попадаю в редактор конфигурации wsgi:

pythonanywhere.com wsgi

В поле редактора нахожу комментарий # +++++++++++ FLASK +++++++++++, выделяю весь текст выше этого комментария и удаляю, а текст ниже этого комментария привожу к следующему виду:

pythonanywhere.com edited wsgi

Сохраняю зелёной кнопкой Save и возвращаюсь на вкладку Web (см. начало в п.8 этого описания). На этой вкладке нахожу кнопку Reload elr.pythonanywhere.com и перезагружаю настроенное приложение:

pythonanywhere.com reload

Дожидаюсь окончания перезагрузки, следую по ссылке elr.pythonanywhere.com:

pythonanywhere.com where

и попадаю на страницу своего приложения:

pythonanywhere.com first show

Успех! Приложение развёрнуто и готово к использованию.

10. Краткое описание исходного приложения и особенностей его использования

Приложение linker имеет четыре активные страницы:

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

Приложение определяет следующие роли пользователей сервиса:

  • Anonymous - имеет доступ только к странице входа для авторизации (ввода логина и пароля);
  • Stranger - имеет доступ к главной странице, может просматривать собственные ранее созданные алиасы, лишен права создавать новые алиасы и удалять собственные ранее созданные;
  • Friend - имеет доступ к главной странице, может просматривать и удалять собственные ранее созданные алиасы и создавать новые алиасы;
  • Owner - администратор сервиса, имеет доступ ко всем страницам сервиса, может просматривать и удалять свои алиасы, алиасы других пользователей сервиса, может создавать новые алиасы, может создавать аккаунты для новых пользователей сервиса и менять их роль.

Ограничения по сокращаемым ссылкам:

  • только http, https url-адреса с явным указанием протокола;
  • максимальная длина начального url-адреса - 512 знаков;
  • валидация ссылок стандартным валидатором WTF на основе регулярного выражения;
  • повтор ссылок одним пользователем запрещен.

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

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

Алиас - в контексте этого описания - укороченная Интернет ссылка, которая обеспечивает переход по начальному url-адресу алиаса.

11. Тестирование elr.pythonanywhere.com в браузере

При переходе по ссылке elr.pythonanywhere.com система автоматически перенаправляет анонимных пользователей на страницу ввода логина и пароля:

linker login

После входа попадаем на главную страницу, где можно создать алиас для любой удовлетворяющей требованиям linker Интернет ссылки:

linker new link

linker created link

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

linker friends

В linker всё устроено достаточно просто, поэтому не буду детально описывать каждую страницу. Приложение развёрнуто и успешно функционирует.

 
Осталось: 92
Комментарии: