- •ВВЕДЕНИЕ
- •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
- •ЗАКЛЮЧЕНИЕ
- •СПИСОК ЛИТЕРАТУРЫ
# Microservices with Docker, Flask, and React [](https://travis-ci.org/YOUR_GITHUB_USERNAME/testdriven- app)
Обязательно замените YOUR_GITHUB_USERNAME своим именем пользователя GitHub.
С точки зрения рабочего процесса, структура проекта пока всё ещё проста. Операции рабочего процесса, которые необходимо совершать:
1)добавление новых функций локально;
2)выполнение коммита и отправка кода на GitHub;
3)проверка, что тесты проходят на Travis.
2.3. ПАНЕЛЬ ИНСТРУМЕНТОВ ОТЛАДКИ FLASK
Панель инструментов Flask Debug Toolbar – это расширение Flask, которое помогает выполнять отладку разрабатываемого приложения. Расширение добавляет в представление панель инструментов отладки, которая предоставляет информацию о заголовках HTTP, переменных запроса, настройках конфигурации и количестве запросов SQLAlchemy, потребовавшихся для визуализации представления. Вы можете использовать эту информацию, чтобы найти узкие места в рендеринге представления.
Добавим соответствующий пакет в файл requirements.txt:
flask-debugtoolbar==0.10.1
Чтобы включить Flask Debug Toolbar, создайте экземпляр панели инструментов, а затем добавьте его в приложение в функцию create_app() в файл services/users/project /__init__.py:
import os
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_debugtoolbar import DebugToolbarExtension
# инстанционирование расширений db = SQLAlchemy()
toolbar = DebugToolbarExtension()
def create_app(script_info=None):
# инстанционирование приложения app = Flask(__name__)
# подключение конфигурации
app_settings = os.getenv('APP_SETTINGS') app.config.from_object(app_settings)
36
# запусе расширений db.init_app(app) toolbar.init_app(app)
# регистрация blueprints
from project.api.users import users_blueprint app.register_blueprint(users_blueprint)
# контекст оболочки для flask cli app.shell_context_processor({'app': app, 'db': db}) return app
Далее обновляем конфигурацию:
# services/users/project/config.py import os
class BaseConfig:
"""Базовая конфигурация"""
TESTING = False
SQLALCHEMY_TRACK_MODIFICATIONS = False
SECRET_KEY = 'secret_key'
DEBUG_TB_ENABLED = False
DEBUG_TB_INTERCEPT_REDIRECTS = False
class DevelopmentConfig(BaseConfig):
"""Конфигурация для разработки"""
SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URL') DEBUG_TB_ENABLED = True
class TestingConfig(BaseConfig):
"""Конфигурация для тестирования"""
TESTING = True
SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_TEST_URL') class ProductionConfig(BaseConfig):
"""Конфигурация для производственной среды"""
SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URL')
Добавим новую конфигурацию в тесты в services/users/project/tests/ test_config.py:
# services/users/project/tests/test_config.py import os
import unittest
from flask import current_app
from flask_testing import TestCase
from project import create_app app = create_app()
class TestDevelopmentConfig(TestCase): def create_app(self):
37
app.config.from_object('project.config.DevelopmentConfig') return app
def test_app_is_development(self): self.assertTrue(app.config['SECRET_KEY'] == 'secret_key')
self.assertFalse(current_app is None) self.assertTrue(
app.config['SQLALCHEMY_DATABASE_URI'] == os.environ.get('DATABASE_URL')
)
self.assertTrue(app.config['DEBUG_TB_ENABLED'])
class TestTestingConfig(TestCase): def create_app(self):
app.config.from_object('project.config.TestingConfig') return app
def test_app_is_testing(self): self.assertTrue(app.config['SECRET_KEY'] == 'secret_key') self.assertTrue(app.config['TESTING']) self.assertFalse(app.config['PRESERVE_CONTEXT_ON_ EXCEPTION']) self.assertTrue(
app.config['SQLALCHEMY_DATABASE_URI'] == os.environ.get('DATABASE_TEST_URL')
)
self.assertFalse(app.config['DEBUG_TB_ENABLED'])
class TestProductionConfig(TestCase): def create_app(self):
app.config.from_object('project.config.ProductionConfig') return app
def test_app_is_production(self): self.assertTrue(app.config['SECRET_KEY'] == 'secret_key') self.assertFalse(app.config['TESTING']) self.assertFalse(app.config['DEBUG_TB_ENABLED'])
if __name__ == '__main__': unittest.main()
Обновим контейнеры и запустим тесты:
$ docker-compose -f docker-compose-dev.yml up -d $ docker-compose -f docker-compose-dev.yml \
run users python manage.py test
Наконец, определим IP-адрес, связанный с контейнером testdriven-dev:
$ docker-machine ip testdriven-dev
Перейдём по адресу http://DOCKER_MACHINE_IP/ в браузере, чтобы просмотреть панель инструментов в действии:
38
2.4.СТРУКТУРА ПРИЛОЖЕНИЯ
Вконце части 2 структура проекта должна выглядеть так:
├── README.md
├── docker-compose-dev.yml
├── docker-compose-prod.yml
└── services └── users
├── Dockerfile-dev
├── Dockerfile-prod
├── entrypoint-prod.sh
├── entrypoint.sh
├── htmlcov
├── 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
39
