Статический сервер хранения изображений:
POSTиDELETEзащищены статичным токеном (Bearer).GET /images/...открыт без авторизации.- При загрузке изображение автоматически конвертируется в
WEBP. - После загрузки API делает редирект на публичный URL сохраненного файла.
- Python
3.10+
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txtПеременные окружения:
STORAGE_API_TOKEN- токен дляPOST/DELETE(по умолчанию:change-me-token)STORAGE_DIR- путь до постоянного хранилища файлов (по умолчанию:data/images)STORAGE_WEBP_QUALITY- качество WEBP (0..100, по умолчанию:80)STORAGE_WEBP_METHOD- метод кодирования WEBP (0..6, по умолчанию:2, меньше = быстрее)STORAGE_MAX_IMAGE_SIDE- ограничение максимальной стороны в пикселях (по умолчанию:0, без ограничения)STORAGE_MAX_CONVERT_CONCURRENCY- число одновременных конвертаций (по умолчанию:cpu_count/2, минимум1)
Пример:
export STORAGE_API_TOKEN="super-secret-token"
export STORAGE_DIR="./data/images"
export STORAGE_WEBP_QUALITY="80"
export STORAGE_WEBP_METHOD="2"
export STORAGE_MAX_IMAGE_SIDE="0"
export STORAGE_MAX_CONVERT_CONCURRENCY="4"uvicorn app.main:app --host 0.0.0.0 --port 8000Документация OpenAPI:
- Swagger UI:
http://localhost:8000/docs - ReDoc:
http://localhost:8000/redoc
curl -i -X POST "http://localhost:8000/api/images" \
-H "Authorization: Bearer super-secret-token" \
-F "file=@./photo.jpg"Ожидаемый ответ: 303 See Other и заголовок Location: /images/<uuid>.webp
curl -i -X DELETE "http://localhost:8000/api/images/<uuid>.webp" \
-H "Authorization: Bearer super-secret-token"Ожидаемый ответ: 204 No Content
curl -I "http://localhost:8000/images/<uuid>.webp"Ожидаемый ответ: 200 OK (если файл существует)
pytest