78 lines
2.6 KiB
Markdown
78 lines
2.6 KiB
Markdown
## Сервис обработки изображений
|
||
|
||
Данный сервис принимает на вход изображения типа `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)
|
||
```
|