CRUD для Yatube

Задача

В проекте 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 или её аналогов. Возможно, это упростит выполнение задания, но мы считаем важным, чтобы вы реализовали всё самостоятельно.

Архив с готовым проектом:





Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: