- •ВВЕДЕНИЕ
- •1. ПОДГОТОВКА К РАЗРАБОТКЕ
- •1.1. НАЧАЛО РАБОТЫ
- •1.2. ИСПОЛЬЗОВАНИЕ КОНТЕЙНЕРОВ DOCKER
- •1.3. НАСТРОЙКА СУБД POSTGRESQL
- •1.4. НАСТРОЙКА ТЕСТОВ
- •1.6. СОЗДАНИЕ RESTFUL-МАРШРУТОВ
- •1.6.1. МАРШРУТ POST /USERS
- •1.6.3. МАРШРУТ GET /USERS
- •1.6.2. МАРШРУТ GET /USERS/:ID
- •1.7. ИСПОЛЬЗОВАНИЕ ШАБЛОНОВ JINJA
- •1.8. СТРУКТУРА ПРОЕКТА
- •2. ОТЛАДКА ПРИЛОЖЕНИЯ
- •2.1. ПОКРЫТИЕ ТЕСТАМИ И КАЧЕСТВО КОДА
- •2.1.1. ПОКРЫТИЕ КОДА ТЕСТАМИ
- •2.1.2. КАЧЕСТВО КОДА
- •2.2. НЕПРЕРЫВНАЯ ИНТЕГРАЦИЯ
- •2.3. ПАНЕЛЬ ИНСТРУМЕНТОВ ОТЛАДКИ FLASK
- •2.4. СТРУКТУРА ПРИЛОЖЕНИЯ
- •3. РАЗВИТИЕ ПРИЛОЖЕНИЯ
- •3.1. ПАКЕТ FLASK MIGRATE
- •3.1.1. ИЗМЕНЕНИЕ МОДЕЛИ
- •3.1.2. НАСТРОЙКА FLASK MIGRATE
- •3.2. РЕФАКТОРИНГ КОДА
- •3.3. ПАКЕТ FLASK BCRYPT
- •3.4. НАСТРОЙКА LOG ROUNDS
- •3.5. ИСПОЛЬЗОВАНИЕ ТОКЕНОВ JWT
- •3.5.1. ПАКЕТ PYJWT
- •3.5.2. РАСШИФРОВКА ТОКЕНА
- •3.6. МАРШРУТЫ ДЛЯ АУТЕНТИФИКАЦИИ
- •3.6.1. МАРШРУТ POST /AUTH/REGISTER
- •3.6.2. МАРШРУТ POST /AUTH/LOGIN
- •3.6.3. МАРШРУТ GET /AUTH/LOGOUT
- •3.6.4. МАРШРУТ GET /AUTH/STATUS
- •ЗАКЛЮЧЕНИЕ
- •СПИСОК ЛИТЕРАТУРЫ
Министерство науки и высшего образования Российской Федерации
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Тамбовский государственный технический университет»
А. И. ЕЛИСЕЕВ Ю. В. МИНИН В. А. ГРИДНЕВ
РАЗРАБОТКА ВЕБ-ПРИЛОЖЕНИЙ
СИСПОЛЬЗОВАНИЕМ ФРЕМВОРКА FLASK
ВДВУХ ЧАСТЯХ
Часть 2
Утверждено Учёным советом университета в качестве учебного пособия для студентов 3–4 курсов
направления подготовки 09.03.02 «Информационные системы и технологии» и 1 курса направления подготовки 09.04.02 «Информационные системы и технологии» очной формы обучения
Учебное электронное издание
Тамбов Издательский центр ФГБОУ ВО «ТГТУ»
2021
1
УДК 681
ББК ç973.26-018.4я73 Е51
Рецензенты:
Доктор технических наук, доцент, доцент кафедры «Мехатроника и технологические измерения»
ФГБОУ ВО «ТГТУ»
А. П. Савенков
Кандидат технических наук, доцент, доцент института математики, физики и информационных технологий
ФГБОУ ВО «ТГУ имени Г. Р. Державина»
И. А. Зауголков
Елисеев, А. И.
Е51 Разработка веб-приложений с использованием фреймворка Flask. В 2-х ч. [Электронный ресурс] : учебное пособие / А. И. Елисеев, Ю. В. Минин, В. А. Гриднев. – Тамбов : Издательский центр ФГБОУ ВО «ТГТУ».
ISBN 978-5-8265-2187-8
Ч. 2. – 2021. – 1 электрон. опт. диск (CD-ROM). – Системные требования : ПК не ниже класса Pentium II ; CD-ROM-дисковод ; 14,0 Mb ; RAM ; Windows 95/98/XP ;
мышь. – Загл . с экрана. ISBN 978-5-8265-2438-1
Вторая часть пособия охватывает следующие области веб-разработки: разработка через тестирование, модульное и интеграционное тестирование, покрытие кода тестами, контейнеризация приложений, непрерывная интеграция и непрерывное развёртывание, аутентификация с использованием токенов JWT.
Предназначено для студентов 3–4 курсов направления подготовки 09.03.02 «Информационные системы и технологии» и 1 курса направления подготовки 09.04.02 «Информационные системы и технологии» очной формы обучения.
УДК 681
ББК ç973.26-018.4я73
Все права на размножение и распространение в любой форме остаются за разработчиком. Нелегальное копирование и использование данного продукта
запрещено.
ISBN 978-5-8265-2187-8 |
(общ.) |
© Федеральное государственное бюджетное |
ISBN 978-5-8265-2438-1 |
(Ч. 2) |
образовательное учреждение высшего |
|
|
образования «Тамбовский государственный |
|
|
технический университет» |
|
|
(ФГБОУ ВО «ТГТУ»), 2021 |
2
ВВЕДЕНИЕ
Flask – фреймворк для создания веб-приложений на языке программиро-
вания Python, использующий набор инструментов Werkzeug, а также шаблони-
затор Jinja2. API фреймворка довольно небольшой, что делает его лёгким для изучения и простым в использовании. Но при всём при этом он достаточно мощный, чтобы обеспечивать работу приложений уровня предприятия, обраба-
тывающие большие объёмы трафика.
Цель настоящего пособия – продемонстрировать процесс разработки со-
временного веб-приложения на основе фреймворка Flask. Несмотря на то, что пособие не требует никаких начальных знаний о фреймворке Flask, предполага-
ется, что концепции языка Python, такие как пакеты, модули, функции, декора-
торы и объектно-ориентированное программирование, уже известны.
Вторая часть пособия охватывает следующие области веб-разработки:
разработка через тестирование, модульное и интеграционное тестирование, по-
крытие кода тестами, контейнеризация приложений, непрерывная интеграция и непрерывное развёртывание, аутентификация с использованием токенов JWT.
3
1. ПОДГОТОВКА К РАЗРАБОТКЕ
Первая часть пособия посвящена разворачиванию воспроизводимой сре-
ды разработки с помощью Docker для создания RESTful API на базе языка про-
граммирования Python, системы управления базами данных PostgreSQL и веб-
фреймворка Flask.
1.1.НАЧАЛО РАБОТЫ
Вэтой главе мы построим структуру проекта и создадим первый сервис.
Перед началом работы необходимо создать новый проект и установить веб-
фреймворк Flask:
$ mkdir testdriven-app && cd testdriven-app $ mkdir services && cd services
$ mkdir users && cd users $ mkdir project
$ python3.6 -m venv env $ source env/bin/activate
(env)$ pip install flask==0.12.2
Добавим файл __init__.py в каталог project и создадим первый маршрут:
#services/users/project/__init__.py from flask import Flask, jsonify
#инстанционирование приложения
app = Flask(__name__) @app.route('/users/ping', methods=['GET']) def ping_pong(): return jsonify({
'status': 'success', 'message': 'pong!'
})
Далее настроим инструмент Flask CLI для запуска и управления прило-
жением из командной строки. Flask CLI представляет собой альтернативу паке-
ту Flask Script, но является более новой библиотекой. Добавим файл manage.py
в каталог users следующего содержания:
# services/users/manage.py
from flask.cli import FlaskGroup from project import app
cli = FlaskGroup(app)
4
if __name__ == '__main__':
cli()
Мы создали экземпляр класса FlaskGroup, чтобы расширить стандартный интерфейс командной строки с помощью команд, связанных с приложением
Flask.
Запустим сервер:
(env)$ export FLASK_APP=project/__init__.py
(env)$ python manage.py run
После перехода по адресу http://localhost:5000/users/ping в браузере вы увидите следующий результат:
{
"message": "pong!",
"status": "success"
}
Завершим работу сервера и добавим новый файл с именем config.py в ка-
талог project следующего содержания:
# services/users/project/config.py
class BaseConfig:
"""Базовая конфигурация"""
TESTING = False
class DevelopmentConfig(BaseConfig):
"""Конфигурация для разработки"""
pass
class TestingConfig(BaseConfig):
"""Конфигурация для тестирования"""
TESTING = True
class ProductionConfig(BaseConfig):
"""Конфигурация для производственной среды"""
pass
Обновим файл __init__.py, чтобы можно было использовать конфигура-
цию для разработки при инициализации приложения:
#services/users/project/__init__.py from flask import Flask, jsonify
#инстанционирование приложения
app = Flask(__name__)
# подключение конфигурации app.config.from_object('project.config.DevelopmentConfig')
5
@app.route('/users/ping', methods=['GET'])
def ping_pong():
return jsonify({
'status': 'success',
'message': 'pong!'
})
Снова запустим приложение, на этот раз включив режим отладки:
$ export FLASK_DEBUG=1
$ python manage.py run
*Serving Flask app "project"
*Forcing debug mode on
*Running on http://127.0.0.1:5000/ (Press CTRL+C to quit) * Restarting with stat
*Debugger is active!
*Debugger PIN: 128-868-573
Теперь, когда мы вносим изменения в код, приложение автоматически переза-
гружается. После этого завершим работу сервера и отключимся от виртуальной среды. Добавим файл requirements.txt следующего содержания в каталог users:
Flask
Наконец, добавим файл. gitignore в корень проекта со следующим содержани-
ем:
__pycache__
env
Инициализируем репозиторий Git и выполним команду git push для отправки ко-
да на GitHub. Затем обновим файл project/__init__.py, чтобы получить значения переменных среды:
#services/users/project/__init__.py import os
from flask import Flask, jsonify
#инстанционирование приложения
app = Flask(__name__)
# подключение конфигурации
app_settings = os.getenv('APP_SETTINGS') app.config.from_object(app_settings) @app.route('/users/ping', methods=['GET']) def ping_pong():
return jsonify({
'status': 'success',
6
