Задача
В проекте api_yatube
есть приложение posts с описанием моделей Yatube. Вам нужно реализовать API для всех моделей приложения.
Обычно всю логику API выносят в отдельное приложение: при иной организации кода работать в большом проекте со множеством приложений будет неудобно.
Добавьте в проект новое приложение с именем «api» и реализуйте всю логику именно там.
API должен быть доступен только аутентифицированным пользователям. Используйте в проекте аутентификацию по токену TokenAuthentication.
Аутентифицированный пользователь авторизован на изменение и удаление своего контента; в остальных случаях доступ предоставляется только для чтения. При попытке изменить чужие данные должен возвращаться код ответа 403 Forbidden.
Для взаимодействия с ресурсами опишите и настройте такие эндпоинты:
api/v1/api-token-auth/
(POST): передаём логин и пароль, получаем токен.api/v1/posts/
(GET, POST): получаем список всех постов или создаём новый пост.api/v1/posts/{post_id}/
(GET, PUT, PATCH, DELETE): получаем, редактируем или удаляем пост поid
.api/v1/groups/
(GET): получаем список всех групп.api/v1/groups/{group_id}/
(GET): получаем информацию о группе поid
.api/v1/posts/{post_id}/comments/
(GET, POST): получаем список всех комментариев поста сid=post_id
или создаём новый, указавid
поста, который хотим прокомментировать.api/v1/posts/{post_id}/comments/{comment_id}/
(GET, PUT, PATCH, DELETE): получаем, редактируем или удаляем комментарий поid
у поста сid=post_id
.
В ответ на запросы POST, PUT и PATCH ваш API должен возвращать объект, который был добавлен или изменён.
Обязательное условие: работайте с моделью Post через ModelViewSet
.
Если вы решите, что вьюсеты подойдут и для работы с остальными моделями — не стесняйтесь, применяйте их везде, где можно.
Примеры запросов
Пример POST-запроса с токеном Антона Чехова: добавление нового поста.POST …/api/v1/posts/
{
"text": "Вечером собрались в редакции «Русской мысли», чтобы поговорить о народном театре. Проект Шехтеля всем нравится.",
"group": 1
}
Пример ответа:
{
"id": 14,
"text": "Вечером собрались в редакции «Русской мысли», чтобы поговорить о народном театре. Проект Шехтеля всем нравится.",
"author": "anton",
"image": null,
"group": 1,
"pub_date": "2021-06-01T08:47:11.084589Z"
}
Пример POST-запроса с токеном Антона Чехова: отправляем новый комментарий к посту с id=14
.POST …/api/v1/posts/14/comments/
{
"text": "тест тест",
}
Пример ответа:
{
"id": 4,
"author": "anton",
"post": 14,
"text": "тест тест",
"created": "2021-06-01T10:14:51.388932Z"
}
Пример GET-запроса с токеном Антона Чехова: получаем информацию о группе.GET …/api/v1/groups/2/Пример ответа:
{
"id": 2,
"title": "Математика",
"slug": "math",
"description": "Посты на тему математики"
}
Подсказки
Начните с описания файла urls.py на уровне проекта. Он должен включать (include) маршруты из приложения api.Если решите везде использовать вьюсеты, то вам понадобится:
- использование регулярных выражений для регистрации некоторых роутеров — это отличный повод повторить урок и заглянуть в шпаргалку;
- разобраться с использованием метода
get_queryset()
вьюсета при передаче дополнительных переменных в запросе; - при запросе на изменение или удаление данных осуществлять проверку прав. Эту задачу можно реализовать, переопределив методы perform_update и perform_destroy, например, вот так:
def perform_update(self, serializer):
if serializer.instance.author != self.request.user:
raise PermissionDenied('Изменение чужого контента запрещено!')
super(PostViewSet, self).perform_update(serializer)
Но можно использовать и иные способы.
Ограничения
Не применяйте сторонние библиотеки вроде Nested Routers или её аналогов. Возможно, это упростит выполнение задания, но мы считаем важным, чтобы вы реализовали всё самостоятельно.
Архив с готовым проектом: