25 lines
2.3 KiB
Markdown
25 lines
2.3 KiB
Markdown
Эндпоинт ожидает запрос с методом `POST`, так как это загрузка файла.
|
||
|
||
При попытке подать не изображение `pillow` вызывает исключение `UnidentifiedImageError`,
|
||
но если подать `gif`, то исключения не будет. Задача обрабатывать только `png` и `jpeg`,
|
||
так что в двух случаях выше возвращается `HTTP_415_UNSUPPORTED_MEDIA_TYPE`.
|
||
|
||
Если же подать битый `png` или `jpeg` файл, то `Image.resize` вызовет `OSError` или `SyntaxError`,
|
||
так что они отлавливаются отдельно. В таком случае возвращается `HTTP_422_UNPROCESSABLE_ENTITY`.
|
||
|
||
Если будет какое-то другое исключение в этом блоке, то вернётся `500` ответ, так как,
|
||
по моим тестам, никакого другого исключения быть не должно. В этом блоке стоит добавить логирование, если оно имеется.
|
||
|
||
Саму обработку изображений я делаю через `Celery`, так как это позволит не давать лишнюю `CPU Bound`
|
||
нагрузку на этот поток и работать в асинхронном режиме.
|
||
|
||
Далее генерируется уникальный `UUID` для каждого изображения.
|
||
Использование `UUID` позволяет не беспокоиться о том, что будет перезаписано старое изображение.
|
||
|
||
Далее генерируется `POST` запрос через `boto3`, отправляется готовое изображение на S3 бакет,
|
||
генерируется ссылка на него и возвращается в виде `JSON` `{"resized_image_link": response}`.
|
||
|
||
Если в этом блоке будет вызвано исключение, то ошибка никак не связанна с поданными данными,
|
||
соответственно не стоит давать лишнюю информацию по ней.
|
||
Возвращается `HTTP_500_INTERNAL_SERVER_ERROR` без описания ошибки
|
||
|