Первая часть тестового задания в компанию bewise на должность python разработчика.
- Клонировать репозиторий:
git clone https://github.com/KirillYabl/TestTaskBewiseFirstQuestions.git
- Переименовать (или создать) файлы в директории
src
:
.dev.env.txt
->.dev.env
.env.txt
->.env
Это файлы переменных окружения, необходимых для запуска, самое важное в этих файлах:
-
Заполнить переменные
POSTGRES_*
-
Переменная
POSTGRES_HOST
должна обязательно отличаться и должна быть равнойdb
иtestdb
в файлах.env
и.dev.env
соответственно, потому что они так указаны в файлахdocker-compose.yaml
иdocker-compose.dev.yaml
соответственно, если вы захотите дать им другое значение, то поменяйте его также и вdocker-compose
-
Собрать боевое и тестовое (если нужно запускать тесты) окружения
docker compose build
docker compose -f docker-compose.dev.yaml build
- Инициализировать БД и создать в ней таблицы (при первом запуске тестов), может выполняться около минуты
docker compose -f docker-compose.dev.yaml run --rm testapi python3 db_models.py
- Запустить тесты
docker compose -f docker-compose.dev.yaml run --rm testapi pytest
- Остановить контейнеры
docker compose -f docker-compose.dev.yaml down
- Инициализировать БД и создать в ней таблицы (при первом запуске сервиса), может выполняться около минуты
docker compose run --rm api python3 db_models.py
- Запустить сервис
docker compose up
После этого сервис запусится по адресу 127.0.0.1:8000
Запросы можно отправлять как с со страницы документации, генерируемой FastApi
Так и непосредственно напрямую, например через curl:
curl -X POST http://127.0.0.1:8000 -H "Content-Type: application/json" -d '{"questions_num": 5}'
Название | Значение по умолчанию | Описание |
---|---|---|
SEARCH_QUESTIONS_QUERIES_LIMIT | 4 | Лимит запросов к API jservice, на один запрос пользователя, если лимит превышен, то ошибка |
JSERVICE_API_DATE_FORMAT | %Y-%m-%dT%H:%M:%S.%f%z | Формат даты и времени в API jservice на случай изменения |
LOGGING_LEVEL | 1 | Уровень логировани от 0 (не логировать) до 5 (только критические ошибки) |
POSTGRES_PASSWORD | DB_PASSWORD | Пароль к БД |
POSTGRES_USER | USER_NAME | Имя пользователя БД |
POSTGRES_HOST | db | Имя хоста БД (значение также зашито в конфиге докера, поэтому менять нужно и там) |
POSTGRES_PORT | 5432 | Порт БД (значение также зашито в конфиге докера, поэтому менять нужно и там) |
POSTGRES_DB | DB_NAME | Имя БД |
API_HOST | 0.0.0.0 | Хост API (из докера будет проецироваться в 127.0.0.1) |
API_PORT | 8000 | Порт API |
- С помощью Docker (предпочтительно - docker-compose) развернуть образ с любой опенсорсной СУБД (предпочтительно - PostgreSQL). Предоставить все необходимые скрипты и конфигурационные (docker/compose) файлы для развертывания СУБД, а также инструкции для подключения к ней. Необходимо обеспечить сохранность данных при рестарте контейнера (то есть - использовать volume-ы для хранения файлов СУБД на хост-машине.
- Реализовать на Python3 веб сервис (с помощью FastAPI или Flask, например), выполняющий следующие функции:
- В сервисе должно быть реализован POST REST метод, принимающий на вход запросы с содержимым вида {"questions_num": integer}.
- После получения запроса сервис, в свою очередь, запрашивает с публичного API (англоязычные вопросы для викторин) https://jservice.io/api/random?count=1 указанное в полученном запросе количество вопросов.
- Далее, полученные ответы должны сохраняться в базе данных из п. 1, причем сохранена должна быть как минимум следующая информация (название колонок и типы данный можете выбрать сами, также можете добавлять свои колонки): 1. ID вопроса, 2. Текст вопроса, 3. Текст ответа, 4. - Дата создания вопроса. В случае, если в БД имеется такой же вопрос, к публичному API с викторинами должны выполняться дополнительные запросы до тех пор, пока не будет получен уникальный вопрос для викторины.
- Ответом на запрос из п.2.a должен быть предыдущей сохранённый вопрос для викторины. В случае его отсутствия - пустой объект.
- В репозитории с заданием должны быть предоставлены инструкции по сборке докер-образа с сервисом из п. 2., его настройке и запуску. А также пример запроса к POST API сервиса.
- Желательно, если при выполнении задания вы будете использовать docker-compose, SQLAalchemy, пользоваться аннотацией типов.