test_zadanie_S3/README.md
2024-03-23 14:09:12 +03:00

78 lines
2.6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

## Сервис обработки изображений
Данный сервис принимает на вход изображения типа `png` или `jpeg` и необходимую ширину выходного
изображения в пикселях(Опционально. По умолчанию 250 пикселей),
изменяет размер изображения до указанной ширины сохраняя пропорции,
загружает итоговое изображение на сервер AWS S3 и возвращает ссылку на загруженный файл.
## Установка
Перед началом использования стоит убедиться, что у вас имеется готовый
`AWS S3` бакет.
Так же для работы `Celery` потребуется сервер `Redis`.
Он может быть поднят отдельно, либо сразу со всем сервисом в докере.
В корне проекта создаём `.env` файл и заполняем в нём необходимые поля по примеру из `.env_template`
Далее устанавливаем всё необходимое.
```shell
pip install -r requirements.txt
---> 100%
```
В терминале пишем
```shell
celery -A app.tasks.celery:celery worker --loglevel=INFO
```
В другом терминале пишем
```shell
uvicorn app.main:app --reload
```
Теперь `API` доступен на http://localhost:8000/api/upload_image
и документация на http://localhost:8000/docs
## Установка в docker
Так же создаём `.env` файл и заполняем его всем необходимым
В поле `REDIS_HOST` указываем `redis`
В терминале пишем
```shell
docker compose build
docker compose up -d
```
`API` будет доступен на порте `9000`
## Пример использования
```python
import requests
def send_image(image_path: str, target_width: int) -> None:
with open(image_path, 'rb') as file:
file_data = file.read()
url = f'http://localhost:9000/api/upload_image/?target_width={target_width}'
response = requests.post(url, files={'file': file_data})
if response.status_code == 200:
link = response.json()["resized_image_link"]
print("Файл успешно отправлен!", link, sep="\n")
else:
print("Ошибка при отправке файла:", response.status_code, response.json()["detail"])
if __name__ == "__main__":
send_image("image.png", 300)
```