Написать REST API на фреймворке FastAPI с использованием БД PostgreSQL в docker-контейнерах. Должно быть два контейнера, в одном само приложение, во втором БД. Метод должен принимать POST-запросом строку адреса, запрашивать по ней информацию о координатах в геокодере и сохранять в БД. Если в БД адрес уже есть, то возвращать данные из нее. Выбор геокодера на твое усмотрение, это должно быть реальное API.
- Склонируйте репозиторий, загрузите зависимости и создайте
.envфайл из шаблона:
git clone https://github.com/bleschunov/geocoder_test_task.git
cd geocoder_test_task
cat .env.template >> .env- В
.envзаполните переменные окружения.- В
DOUBLE_GIS_API_KEYукажите API KEY из личного кабинета 2GIS - В
DB_CONNECTION_STRINGукажите строку подключения к базе данных в формате:postgresql+asyncpg://db_user:db_password@db_host:db_host/db_name - В
POSTGRES_USERиPGUSERможно поставить одинаковые значения. - В
POSTGRES_HOSTнужно поставить postgres [название сервиса в docker-compose.yml], так как далее будет запускать в контейнере.
- В
Выполните команды
docker compose -f docker-compose.service.yml -f docker-compose.db.yml up Вам будет доступен SwaggerUI по ссылке http://localhost:8080/docs
Создайте .env.test, установите зависимости:
python -m venv venv
source venv/bin/activate
pip install -r requirements.txt
cat .env >> .env.testЗамените хост базы данных в .env.test в DB_CONNECTION_STRING и в POSTGRES_HOST на localhost
Запустите тестовую базу:
docker compose -f docker-compose.testdb.yml up -dЧтобы запустить каждый из тестов выполните команды:
python test/test_src/test_model/test_geocoder_model.py TestGeocoderModel.test_getting_point_from_cache
python test/test_src/test_model/test_geocoder_model.py TestGeocoderModel.test_getting_point_from_api
python test/test_src/test_model/test_geocoder_model.py TestGeocoderModel.test_exception_404_if_point_is_not_foundИспользую расширение PostgreSQL pgtrgm. В init.sql устанавливается threshold, который можно регулировать для чувствительности сравнения.
Использую 2GIS геокодер. Он показался оптимальным по соотношению простоты использования и функционалу.