Это простой тестовый backend сервис написанный на базе фреймворка FastAPI, который реализует загрузку, скачивание изображений на сервер и применение фильтров (invert, canny)
Проект разрабатывался в IDE Visual Studio Code под ОС Ubuntu 20.04.01 Для запуска и отладки необходимы следующие программные модули:
- Python 3.12.2
- PostgreSQL 12.18
- Git 2.25.1 и выше
Убедитесь, что эти модули установлены прежде чем переходить к установке проекта и зависимостей.
Чтобы перенести проект на локальный компьютер склонируйте репозиторий из Github:
git clone https://github.com/SovoN-Niko/images_server
Создайте пользователя и базу данных для сервиса.
Для этого запустите интерактивный терминал PostgreSQL
sudo -u postgres psql
И выполните ряд команд:
CREATE USER developer;
ALTER USER developer WITH PASSWORD 'AIxOCnUtgh';
CREATE DATABASE image_service;
GRANT ALL ON DATABASE image_service TO developer;
В скачанном репозитории перейдите в директорию backend:
cd backend
Создайте виртуальное окружение:
python -m venv .venv
и активируйте его:
source .venv/bin/activate
Установите зависимости из requirements.txt:
sudo pip install -r requirements.txt
Примените последнюю миграцию, чтобы база данных была в актуальном состоянии:
alembic upgrade head
Чтобы запустить приложение на выполните команду в терминале:
uvicorn app.main:app --port 8080 --reload
Это запустит приложение на http://127.0.0.1:8080
Чтобы проверить работу программу вручную перейдите по ссылке http://127.0.0.1:8000/docs. Это позволит вводить GET и POST запросы, описанные в тестовом задании.
Сервис работает с двумя эндпоинтами описанными в images_server/backend/app/routers/image_api.py:
- POST
Запрос является составным и состоит из параметра filter (принимает значения canny и invert) и multipart/form-data с файлом изображения.
Пример запроса:
curl -X 'POST' \
'http://127.0.0.1:8080/img_api/upload?filter=canny' \
-H 'accept: application/json' \
-H 'Content-Type: multipart/form-data' \
-F 'file=@example_1.jpg;type=image/jpeg'
Запрос отправляет изображение (example_1.jpg) на локальный сервер по адресу http://127.0.0.1:8000/img_api/upload, используя метод POST. Он включает параметр filter=canny для указания фильтра Canny, передает файл как multipart/form-data, и ожидает ответ в формате JSON.
Ответ на запрос (Успешный):
{ "detail": "Successfully update image!", "id": "fc2e74c5-04c6-4bfd-8d8f-816e49f780a8", "filename": "example_1.jpg", "filter": "canny", "modified_at": "2024-09-03T03:55:08.975885" }
Помимо стандартных статус кодов в случае ошибки в ответ на запрос может прийти: статус код "202" и {"detail":"File processing"} это сообщение говорит о том, что пользователь пытается повторно загрузить файл, который в данный момент находится в обработке.
- GET
Запрос состоит из одного параметра "id", который должен содержать id загруженного ранее на сервер изображения в формате UUID4.
Пример запроса:
curl -X 'GET' \
'http://127.0.0.1:8000/img_api/download?id=fc2e74c5-04c6-4bfd-8d8f-816e49f780a8' \
-H 'accept: application/json'
Запрос передает параметр id, по которому в базе данных можно найти путь к загруженному ранее изображению.
В случае успешного запроса в ответ должно прийти изображение и статус код "200".
Если осуществляется попытка запроса файла изображения в момент его обработки фильтром, в ответ на запрос должно прийти: статус код "202" и {"detail":"File processing"}.
Если id, по которому пытаются получить файл отсутствует в базе данных, то в ответ на запрос должно прийти: статус код "404" и {"detail":"Image not found!"}