Задача
Реализовать серверное приложение (REST API) для проверки отчетов студентов
Описание входных и выходных данных
Входные данные:
- POST запрос с телом
multipart/form-data из двух частей: JSON-объект с описанием отчета и сам отчет в виде двоичного файла.
- POST запрос с телом
application/json, в котором содержится JSON-объект с описанием отчета, отличающийся от аналогичного запроса выше наличием поля "report_link". В ходе обработки запроса бэкенд самостоятельно скачивает отчет по приведенной ссылке.
JSON-объект с описанием отчета
{
"student": {
"name": "Иван",
"surname": "Иванов",
"patronymic": "Иванович",
"group": "4931"
},
"report": {
"subject_name": "Операционные системы",
"task_name": "ЛР1. Знакомство с командным интерпретатором bash",
"task_type": "Лабораторная работа",
"teacher": {
"name": "Юлия",
"surname": "Антохина",
"patronymic": "Анатольевна",
"status": "Ректор, д.т.н., проф."
},
"report_structure": [
"Цель", "Задание", "Результат выполнения", "Выводы"
],
"uploaded_at": "2022-06-01T00:00:00Z"
},
"report_link": "/get-report-t/d37a5eb4013d68149ce209d4a54d394e"
}
Поле patronymic может быть пустым (None в Python) или ключ может отсутствовать вовсе.
Поле group может содержать буквы, поэтому тип - строка.
Поле uploaded_at содержит дату загрузки студентом отчета в личный кабинет в формате ISO 8601 в часовом поясе UTC.
Поле report_link в первом POST-запросе может отсутствовать, но является обязательным во втором запросе. Если хост не указан, подразумевать https://pro.guap.ru.
Выходные данные:
JSON с информацией о результатах валидации отчета. Код возврата 200, если отчет успешно прошел валидацию, и 422, если отчет не прошел валидацию. Другие коды возврата в случае возникновения ошибок на стороне сервера (5XX) или обнаружения ошибок во входных данных (400 - bad request).
Пример 1:
{
"status": "Успешно",
"parser": "docx",
"results": []
}
Пример 2:
{
"status": "С ошибками",
"parser": "pdf",
"results": [
"Неправильное название предмета",
"Неверное ФИО студента",
"Неверная дата"
]
}
Пример 3 (код ответа 400):
{
"status": "error",
"message": "описание исключения (ошибки)",
"parser": null,
"results": []
}
Требования к работе модуля
Реализовать два эндпоинта с помощью Fast API. Автоматическая генерация документации (OpenAPI 3.0, Swagger UI) из кода.
Возможность включить rate limit на запросы, указав специальный ключ при запуске сервера:
- 1 запрос в минуту к эндпоинту, принимающему бинарный файл с отчетом;
- 5 запросов в минуту к эндпоинту, принимающему ссылку на файл с отчетом.
По умолчанию rate limit выключен.
Порядок выполнения работы
- Подготовить заглушки для трех модулей, реализующих проверку отчетов студентов в форматах docx, pdf и odt.
- Реализовать алгоритм определения формата файла отчета (MS Word, PDF, Open Document Format): расширение, сигнатура (только PDF / не PDF), попытка открыть разными библиотеками.
- Реализовать REST API.
- Подготовить docker-файл для запуска бэкенда в докере.
- Оформить проект в виде питоно-пакета (setup.py, requirements.txt и пр.)
- Согласовать список тестов.
- Подготовить тестовые данные, реализовать тесты с использованием
requests и pytest.
- Автоматизировать запуск тестов с помощью GitHub Actions.
Задача
Реализовать серверное приложение (REST API) для проверки отчетов студентов
Описание входных и выходных данных
Входные данные:
multipart/form-dataиз двух частей: JSON-объект с описанием отчета и сам отчет в виде двоичного файла.application/json, в котором содержится JSON-объект с описанием отчета, отличающийся от аналогичного запроса выше наличием поля "report_link". В ходе обработки запроса бэкенд самостоятельно скачивает отчет по приведенной ссылке.JSON-объект с описанием отчета
{ "student": { "name": "Иван", "surname": "Иванов", "patronymic": "Иванович", "group": "4931" }, "report": { "subject_name": "Операционные системы", "task_name": "ЛР1. Знакомство с командным интерпретатором bash", "task_type": "Лабораторная работа", "teacher": { "name": "Юлия", "surname": "Антохина", "patronymic": "Анатольевна", "status": "Ректор, д.т.н., проф." }, "report_structure": [ "Цель", "Задание", "Результат выполнения", "Выводы" ], "uploaded_at": "2022-06-01T00:00:00Z" }, "report_link": "/get-report-t/d37a5eb4013d68149ce209d4a54d394e" }Поле
patronymicможет быть пустым (Noneв Python) или ключ может отсутствовать вовсе.Поле
groupможет содержать буквы, поэтому тип - строка.Поле
uploaded_atсодержит дату загрузки студентом отчета в личный кабинет в формате ISO 8601 в часовом поясе UTC.Поле
report_linkв первом POST-запросе может отсутствовать, но является обязательным во втором запросе. Если хост не указан, подразумеватьhttps://pro.guap.ru.Выходные данные:
JSON с информацией о результатах валидации отчета. Код возврата 200, если отчет успешно прошел валидацию, и 422, если отчет не прошел валидацию. Другие коды возврата в случае возникновения ошибок на стороне сервера (5XX) или обнаружения ошибок во входных данных (400 - bad request).
Пример 1:
{ "status": "Успешно", "parser": "docx", "results": [] }Пример 2:
{ "status": "С ошибками", "parser": "pdf", "results": [ "Неправильное название предмета", "Неверное ФИО студента", "Неверная дата" ] }Пример 3 (код ответа 400):
{ "status": "error", "message": "описание исключения (ошибки)", "parser": null, "results": [] }Требования к работе модуля
Реализовать два эндпоинта с помощью Fast API. Автоматическая генерация документации (OpenAPI 3.0, Swagger UI) из кода.
Возможность включить rate limit на запросы, указав специальный ключ при запуске сервера:
По умолчанию rate limit выключен.
Порядок выполнения работы
requestsиpytest.