https://github.com/belyashnikovatn/api_final_yatube
Сервис предназначен для платформы блогов, где можно создать и прокомментировать публикации.
https://github.com/belyashnikovatn/api_final_yatube
api django djoser drf jwt python
Last synced: 3 months ago
JSON representation
Сервис предназначен для платформы блогов, где можно создать и прокомментировать публикации.
- Host: GitHub
- URL: https://github.com/belyashnikovatn/api_final_yatube
- Owner: belyashnikovatn
- Created: 2024-07-09T09:01:00.000Z (about 2 years ago)
- Default Branch: master
- Last Pushed: 2024-10-27T13:48:29.000Z (over 1 year ago)
- Last Synced: 2025-03-13T09:40:21.962Z (over 1 year ago)
- Topics: api, django, djoser, drf, jwt, python
- Language: Python
- Homepage:
- Size: 126 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# Проект api_final_yatube
Цель проекта – создать сервис api_yatube на основе технического задания.
Сервис предназначен для платформы блогов, где можно создать и прокомментировать публикации.
## Содержание
- [Технологии](#технологии)
- [Запуск проекта](#запуск-проекта)
- [Задачи](#задачи)
- [Функционал](#функционал)
## Технологии:
Python + Django REST Framework + аутентификация по JWT-токенам (при помощи библиотеки Djoser)
## Запуск проекта:
- $ python -m venv venv
- $ source venv/Scripts/activate
- $ python -m pip install --upgrade pip
- $ pip install -r requirements.txt
- $ cd yatube_api
- $ python manage.py migrate
- $ python manage.py runserver
## Задачи:
### Проектирование
На основе ТЗ доработала модель данных предыдущего проекта.

На основе ТЗ выбрала вьюсет, дополнительный функционал и пермишн.
| Модель | Нужные методы | Вьюсет | Доп функционал | Разрешения
| --- | --- | --- | --- | --- |
| Post | get all, post one, patch one, put one, get one, delete one | ModelViewSet | Пагинация при получении списка (с limit и offset). Брать автора из request.user при записи| IsAuthenticatedOrReadOnly + проверка на авторство при NotReadOnly |
| Comment | get all, post one, patch one, put one, get one, delete one | ModelViewSet | Запись автора из request.user, запись публикации из параметров запроса| IsAuthenticatedOrReadOnly + проверка на авторство при NotReadOnly |
| Group | get all, get one | ReadOnlyModelViewSet | --- | IsAuthenticatedOrReadOnly |
| Follow | get all, post one | CreateModelMixin + ListModelMixin + GenericViewSet | Поиск по подпискам при получении списка. Брать автора из request.user при записи. Валидаторы: 1. Пользователь может подписаться на другого пользователя 1 раз. 2. Пользователь не может подписаться сам на себя. | IsAuthenticated |
### Реализация:
- Подключила JWT-авторизацию (срок годности токена - 1 день);
- Настроила разрешения на уровне проекта (IsAuthenticatedOrReadOnly), дополнительно указала у вьюсета для модели Follow (IsAuthenticated);
- На уровне моделей добавила Group (группы для публикаций) и Follow (подписка пользователя на других пользователей), валидатор UniqueConstraint у модели Follow;
- На уровне сериализаторов использовала из прошлого проекта PostSerializer, CommentSerializer, GroupSerializer, добавила FollowSerializator. В FollowSerializator использовала UniqueTogetherValidator, добавила собственный для проверки "пользователь не может подписаться сам на себя". У FollowSerializator поле 'following' представлено в виде SlugRelatedField для представления поля 'username' из связной модели User;
- На уровне представлений использовала из прошлого проекта PostViewSet, CommentViewSet, GroupViewSet. При создании объекта (где это разрешено), автоматом подставляется автор [и публикация], при изменении/удалении происходит проверка на авторство. В PostViewSet настроила пагинацию класса LimitOffsetPagination. Добавила FollowCreateListViewSet для подписки, настроила поиск SearchFilter по подписке: search_fields = ('following__username',);
- Создала и подключила разрешения;
- Настроила urls для вьюсетов и для получения токена.
В ходе реализации тестировала через Postman. По итогу протестировала через pytest от ЯП и через коллекции в Postman.
## Функционал
Детальное описание методов сервиса находится в доке http://127.0.0.1:8000/redoc/
Примеры некоторых запросов:
1. Получение токена
Запрос:
```
POST http://127.0.0.1:8000/api/v1/jwt/create/
{
"username": "string",
"password": "string"
}
```
Ответ:
```
{
"refresh": "string",
"access": "string"
}
```
2. Список публикаций
Запрос:
```
GET http://127.0.0.1:8000/api/v1/posts/
```
или
```
GET http://127.0.0.1:8000/api/v1/posts/?offset=400&limit=100
```
Ответ:
```
{
"count": 123,
"next": "http://api.example.org/accounts/?offset=400&limit=100",
"previous": "http://api.example.org/accounts/?offset=200&limit=100",
"results": [
{
"id": 0,
"author": "string",
"text": "string",
"pub_date": "2021-10-14T20:41:29.648Z",
"image": "string",
"group": 0
}
]
}
```