- •ВВЕДЕНИЕ
- •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
- •ЗАКЛЮЧЕНИЕ
- •СПИСОК ЛИТЕРАТУРЫ
username = request.form['username']
email = request.form['email']
db.session.add(User(username=username, email=email))
db.session.commit()
users = User.query.all()
return render_template('index.html', users=users)
1.8.СТРУКТУРА ПРОЕКТА
Вконце части первой структура проекта должна выглядеть так:
├── docker-compose-dev.yml
├── docker-compose-prod.yml
└── services ├── nginx
│├── Dockerfile
│└── flask.conf └── users
├── Dockerfile-dev
├── Dockerfile-prod
├── entrypoint-prod.sh
├── entrypoint.sh
├── manage.py
├── project
│├── __init__.py
│├── api
││ ├── __init__.py
││ ├── models.py
││ ├── templates
│ │ │ └── index.html
││ └── users.py
│├── config.py
│├── db
││ ├── Dockerfile
││ └── create.sql
│└── tests
│├── __init__.py
│├── base.py
│├── test_config.py
│└── test_users.py
└── requirements.txt
32
2. ОТЛАДКА ПРИЛОЖЕНИЯ
Во второй части пособия мы добавим покрытие кода и тестирование непрерывной интеграции для гарантирования того, что каждая служба может запускаться и тестироваться независимо ото всего приложения.
2.1.ПОКРЫТИЕ ТЕСТАМИ И КАЧЕСТВО КОДА
Вэтом пункте мы добавим в проект покрытие кода, используя скрипт
Coverage.py.
Начнём с установки testdriven-dev в качестве активной среды для Docker
Machine:
$ docker-machine env testdriven-dev
$ eval $(docker-machine env testdriven-dev)
Обновим контейнеры:
$ docker-compose -f docker-compose-dev.yml up -d
Убедимся, что приложение работает в браузере, а затем запустим тесты:
$ docker-compose -f docker-compose-dev.yml \ run users python manage.py test
2.1.1. ПОКРЫТИЕ КОДА ТЕСТАМИ
Покрытие кода тестами – это процесс поиска областей кодовой базы, не проверенных тестами. Имейте в виду, что покрытие кода тестами не измеряет общую эффективность набора тестов.
Добавим файл Coverage.py в файл requirements.txt в каталоге users:
coverage==4.4.2
Далее нужно настроить отчёты о покрытии тестами в файле manage.py. Начнём с добавления конфигурации сразу после импорта:
COV = coverage.coverage( branch=True,
include='project/*',
omit=[
'project/tests/*',
'project/config.py',
]
)
COV.start()
Затем добавим новую команду CLI:
@cli.command()
def cov():
""" Запускает модульные тесты с покрытием."""
tests = unittest.TestLoader().discover('project/tests')
33
result = unittest.TextTestRunner(verbosity=2).run(tests) if result.wasSuccessful():
COV.stop()
COV.save() print('Coverage Summary:') COV.report() COV.html_report() COV.erase()
return 0 return 1
Не забывайте про обновление импорта:
import coverage
Обновим контейнеры:
$ docker-compose -f docker-compose-dev.yml up -d --build
Запустим тесты с учётом покрытия:
$ docker-compose -f docker-compose-dev.yml \ run users python manage.py cov
Вывод на экране должен быть следующим:
Coverage Summary:
Name Stmts Miss Branch BrPart Cover
-------------------------------------------------------------
project/__init__.py |
13 |
5 |
0 |
0 |
62% |
project/api/models.py |
12 |
9 |
0 |
0 |
25% |
project/api/users.py |
48 |
10 |
10 |
0 |
83% |
-------------------------------------------------------------
TOTAL |
73 24 |
10 |
0 |
71% |
HTML-версию можно просмотреть во вновь созданном каталоге htmlcov. Теперь можно быстро определить, какие части кода тестируются, а какие нет.
Следует добавить этот каталог в файлы .gitignore и .dockerignore.
2.1.2. КАЧЕСТВО КОДА
Линтинг – это процесс проверки кода на стилистические или программные ошибки. Хотя существует ряд широко используемых линтеров для Python, будем использовать Flake8, поскольку он объединяет два других популярных линтера – pep8 и pyflakes.
Добавим flake8 в файл requirements.txt в директории users:
flake8==3.5.0
Обновим контейнеры:
$ docker-compose -f docker-compose-dev.yml up -d --build
Запускаем flake8:
$ docker-compose -f docker-compose-dev.yml \ run users flake8 project
34
Были обнаружены какие-либо ошибки?
project/__init__.py:6:1: F401 'flask.jsonify' imported but unused
Прежде чем двигаться дальше, устраните все проблемы. Выполните коммит и отправьте его на GitHub.
2.2. НЕПРЕРЫВНАЯ ИНТЕГРАЦИЯ
Теперь займёмся добавлением в проект непрерывной интеграции
(Сontinuous Integration, CI) с помощью сервиса Travis CI.
Выполним шаги 1 и 2 руководства по началу работы с Travis CI, чтобы включить Travis в проект. Чтобы запустить сборку, добавим файл .travis.yml в корень проекта:
sudo: required
services: - docker
env:
DOCKER_COMPOSE_VERSION: 1.18.0
before_install:
- sudo rm /usr/local/bin/docker-compose
-curl -L
https://github.com/docker/compose/releases/download/${DOCKER_COMPO SE_VERSION}/docker-compose-`uname -s`-`uname -m` > docker-compose
-chmod +x docker-compose
-sudo mv docker-compose /usr/local/bin
before_script:
- docker-compose -f docker-compose-dev.yml up --build -d
script:
-docker-compose -f docker-compose-dev.yml run users python manage.py test
-docker-compose -f docker-compose-dev.yml run users flake8 project
after_script:
- docker-compose -f docker-compose-dev.yml down
Зафиксируйте изменения, а затем отправьте их на GitHub. Эти действия должны вызвать выполнение новой сборки, которая должна завершиться успешно. После этого добавим файл README.md в корень проекта, добавив значок статуса Travis:
35
