Разработать Django REST API, который позволяет загружать файлы на сервер, а затем асинхронно обрабатывать их с использованием Celery.
Создать Django проект и приложение.
Использовать Django REST Framework для создания API. Реализовать модель File, которая будет представлять загруженные файлы. Модель должна содержать поля:
- file: поле типа FileField, используемое для загрузки файла.
- uploaded_at: поле типа DateTimeField, содержащее дату и время загрузки файла.
- processed: поле типа BooleanField, указывающее, был ли файл обработан.
Реализовать сериализатор для модели File.
Создать API эндпоинт upload/
, который будет принимать POST-запросы для загрузки файлов.
При загрузке файла необходимо создать объект модели File, сохранить файл на сервере и запустить асинхронную задачу для обработки файла с использованием Celery.
В ответ на успешную загрузку файла вернуть статус 201 и сериализованные данные файла.
Реализовать Celery задачу для обработки файла. Задача должна быть запущена асинхронно и изменять поле processed модели File на True после обработки файла.
Реализовать API эндпоинт files/
, который будет возвращать список всех файлов с их данными, включая статус обработки.
Использовать Docker для развертывания проекта. Реализовать механизм для обработки различных типов файлов (например, изображений, текстовых файлов и т.д.). Предусмотреть обработку ошибок и возвращение соответствующих кодов статуса и сообщений об ошибках.
При выполнении задания рекомендуется использовать официальную документацию Django, DRF, Celery и Docker. Вы можете использовать любые дополнительные библиотеки, если считаете нужным.
Тесты (постарайтесь достичь покрытия в 70% и больше) Опишите, как изменится архитектура, если мы ожидаем большую нагрузку Попробуйте оценить, какую нагрузку в RPS сможет выдержать ваш сервис
- Если запускаете не на локальном компьютере, то добавить в файл
src/task.settings.py
в переменнуюALLOWED_HOSTS
значение вашего домена:# settings.py ALLOWED_HOSTS = [ "my-domain.com", "127.0.0.1", "localhost", ]
- Создать в корне проекта файл
.env
с переменными окружения для docker-compose:DJANGO_SECRET_KEY=<случайный набор символов, например из команды openssl rand -base64 32> POSTGRES_DB=<имя базы данных> POSTGRES_USER=<имя пользователя для базы данных> POSTGRES_PASSWORD=<пароль пользователя для базы данных>
- Запустить через докер-компоуз:
docker-compose up -d
- http://localhost:8011/upload/ - загрузка файла через форму
- http://localhost:8011/files/ - список объектов
Добавить балансировщик. За ним повесить несколько серверов, которые будут принимать запросы. Масштабировать количество веб серверов с gunicorn в зависимости от http траффика. В зависимости от объема файлов и сложности их обработки масштабировать количество celery воркеров.