cucumberian / _test_picasso

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Тестовое задание: Загрузка и обработка файлов

Цель:

Разработать 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 сможет выдержать ваш сервис

Установка

  1. Если запускаете не на локальном компьютере, то добавить в файл src/task.settings.py в переменную ALLOWED_HOSTS значение вашего домена:
    # settings.py
    
    ALLOWED_HOSTS = [
        "my-domain.com",
        "127.0.0.1",
        "localhost",
    ]
  2. Создать в корне проекта файл .env с переменными окружения для docker-compose:
    DJANGO_SECRET_KEY=<случайный набор символов, например из команды openssl rand -base64 32>
    POSTGRES_DB=<имя базы данных>
    POSTGRES_USER=<имя пользователя для базы данных>
    POSTGRES_PASSWORD=<пароль пользователя для базы данных>
  3. Запустить через докер-компоуз:
    docker-compose up -d

Эндпоинты

джанго

Flower

Как измениться архитектура, если ожидаем большую нагрузку?

Добавить балансировщик. За ним повесить несколько серверов, которые будут принимать запросы. Масштабировать количество веб серверов с gunicorn в зависимости от http траффика. В зависимости от объема файлов и сложности их обработки масштабировать количество celery воркеров.

About


Languages

Language:Python 98.4%Language:Dockerfile 1.6%