Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Разработка веб-приложений с использованием фреймворка Flask. В 2 частях. Ч.2. Учебное пособие-1.pdf
Скачиваний:
2
Добавлен:
06.09.2026
Размер:
421 Кб
Скачать
☆

# Microservices with Docker, Flask, and React [![Build Status](https://travis- ci.org/YOUR_GITHUB_USERNAME/testdriven-app.svg?bran

ch=master)](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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]