A Python/ AioHttp REST API service will analyse the data provided and identify the demand for gifts among residents of different age groups in different cities by month.
In this application I have developed and tested a REST API service in Python, packaged in a lightweight Docker container and deployed using Ansible.
###The following handlers are implemented in the service:
-
POST /imports (Adds a new upload with data);
-
GET /imports/$import_id/citizens (Returns the inhabitants of the specified upload);
-
PATCH /imports/$import_id/citizens/$citizen_id ( Modifies information about the inhabitant (and their relatives) in the specified upload);
-
GET /imports/$import_id/citizens/birthdays (Calculates how many gifts each person in the upload will buy for their relatives (first order), grouped by month);
-
GET /imports/$import_id/towns/stat/percentile/age (Calculates the 50th, 75th and 99th percentiles of age (full years) of residents by town in the specified sample)
The project involves technologies such as:
- Python 3
- AioHttp
- Asyncio
- PostgreSQL
- sqlalchemy core
- Database
- alembic
- ansible
- Docker
- Docker-compose
- flake8
- Pytest
- Swagger
Приложение упаковано в Docker-контейнер и разворачивается с помощью Ansible.
Внутри Docker-контейнера доступны две команды: 🐚analyzer-db
— утилита
для управления состоянием базы данных и 🐚analyzer-api
— утилита для
запуска REST API сервиса.
Как применить миграции:
.. code-block:: shell
docker run -it \ ....#soon
Как запустить REST API сервис локально на порту 8081:
.. code-block:: shell
docker run -it -p 8081:8081 \
.....#soon
Все доступные опции запуска любой команды можно получить с помощью
аргумента 🐚--help
:
.. code-block:: shell
docker run ...#soon
docker run ...#soon
Опции для запуска можно указывать как аргументами командной строки, так и
переменными окружения с префиксом 🐚ANALYZER
(например: вместо аргумента
:shell:--pg-url
можно воспользоваться 🐚ANALYZER_PG_URL
).
Как развернуть?
Чтобы развернуть и запустить сервис на серверах, добавьте список серверов в файл deploy/hosts.ini (с установленной Ubuntu) и выполните команды:
.. code-block:: shell
cd deploy
ansible-playbook -i hosts.ini --user=root deploy.yml
- 🐚
make
Отобразить список доступных команд - 🐚
make devenv
Создать и настроить виртуальное окружение для разработки - 🐚
make postgres
Поднять Docker-контейнер с PostgreSQL - 🐚
make lint
Проверить синтаксис и стиль кода с помощьюpylama
_ - 🐚
make clean
Удалить файлы, созданные модулемdistutils
_ - 🐚
make test
Запустить тесты - 🐚
make sdist
Создатьsource distribution
_ - 🐚
make docker
Собрать Docker-образ - 🐚
make upload
Загрузить Docker-образ на hub.docker.com
.. _pylama: https://github.com/klen/pylama .. _distutils: https://docs.python.org/3/library/distutils.html .. _source distribution: https://packaging.python.org/glossary/
.. code-block:: shell
make devenv make postgres source env/bin/activate analyzer-db upgrade head analyzer-api
После запуска команд приложение начнет слушать запросы на 0.0.0.0:8081.
Для отладки в PyCharm необходимо запустить 🐚env/bin/analyzer-api
.
.. code-block:: shell
make devenv
make postgres
source env/bin/activate
pytest
Для отладки в PyCharm необходимо запустить 🐚env/bin/pytest
.
Для запуска locust
_ необходимо выполнить следующие команды:
.. code-block:: shell
make devenv
source env/bin/activate
locust
После этого станет доступен веб-интерфейс по адресу http://localhost:8089
.. _locust: https://locust.io