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