An open API service indexing awesome lists of open source software.

https://github.com/belyashnikovatn/api_yamdb

Сервис для публикации отзывов на произведения разных категорий и жанров.
https://github.com/belyashnikovatn/api_yamdb

api django drf jwt python

Last synced: 6 months ago
JSON representation

Сервис для публикации отзывов на произведения разных категорий и жанров.

Awesome Lists containing this project

README

          

# Командный проект YaMDb
Проект YaMDb собирает **отзывы** пользователей на **произведения**. Сами произведения в YaMDb не хранятся, здесь нельзя посмотреть фильм или послушать музыку. Произведения делятся на **категории**, такие как «Книги», «Фильмы», «Музыка». Например, в категории «Книги» могут быть произведения «Винни-Пух и все-все-все» и «Марсианские хроники», а в категории «Музыка» — песня «Давеча» группы «Жуки» и вторая сюита Баха. Список категорий может быть расширен (например, можно добавить категорию «Изобразительное искусство» или «Ювелирка»). Произведению может быть присвоен **жанр** из списка предустановленных (например, «Сказка», «Рок» или «Артхаус»). Добавлять произведения, категории и жанры может только администратор. Благодарные или возмущённые пользователи оставляют к произведениям текстовые **отзывы** и ставят произведению оценку в диапазоне от одного до десяти (целое число); из пользовательских оценок формируется усреднённая оценка произведения — **рейтинг** (целое число). **На одно произведение пользователь может оставить только один отзыв.** Пользователи могут оставлять **комментарии** к отзывам.Добавлять отзывы, комментарии и ставить оценки могут только аутентифицированные пользователи.

Цель проекта — научиться работать в команде и с git.
Подробное ТЗ — доки Redoc.

## Команда

**Тим-лид:** [Беляшникова Татьяна](https://github.com/belyashnikovatn)
- Titles, Genres, Categories (модели, вью, сериализаторы, маршруты),
- Иморт данных из .csv-файлов.
**Разработчик 1:** [Иванов Артем](https://github.com/temaivanov)
- Users (модель, вью, сериализатор, маршруты),
- SignUpView и TokenView, сериализаторы, настройка токена,
- Пермишены
- Система подтверждения через email.
**Разработчик 2:** [Курмалеев Руслан](https://github.com/lightningrusleen)
- Reviews, Comments (модели, вью, сериализаторы, маршруты),
- Рейтинг произведений.

## Содержание
- [Технологии](#технологии)
- [Запуск проекта](#запуск-проекта)
- [Реализация](#реализация)
- [Документация](#документация)

## Технологии:
Python + Django REST Framework + аутентификация access JWT-токен

## Запуск проекта:
Клонировать репозиторий и перейти в него в командной строке:

```bash
git clone git@github.com:belyashnikovatn/api_yamdb.git
```
```bash
cd api_yamdb
```
Cоздать и активировать виртуальное окружение:
```bash
python3 -m venv env
```
```bash
source env/bin/activate
```
Установить зависимости из файла requirements.txt:
```bash
python3 -m pip install --upgrade pip
```
```bash
pip install -r requirements.txt
```
Выполнить миграции:
```bash
python3 manage.py migrate
```
Запустить проект:
```bash
python3 manage.py runserver
```

Дополнительно:
Загрузить данные из csv-файлов:
```bash
python3 manage.py import_csv_data
```

## Реализация
Ниже будет кракто представлена структура проекта, с указанием основных техник, использованных в работе.

### Данные:
Используемые модели данных, расположеные в review/models.py:
- **NameSlugModel** (базовая модель для Category и Genre),
- **Category**,
- **Genre**,
- **Title**,
- **GenreTitle** (для связи многие ко многим),
- **AuthorTextPubDateBaseModel** (базовая модель для Review и Comment),
- **Review**,
- **Comment**,
Модель данных **User** была переопределена, и вынесена в отдельное приложение users.

### Маршрутизация
**Entry point:** api_yamdb/urls.py
- admin/ - вход в администраторскую панель,
- redoc/ - ReDoc-документация к АПИ
- api/ -> **api/urls.py**
**Маршруты приложения api:** - используются встроенные маршруты класса DefaultRouter для каждого из классов набора обработчиков запросов -- ViewSet.

Например, по умолчанию:

- GET /titles/: Получить список всех произведений.
- POST /titles/: Добавить новое произведение.
- GET /titles/{titles_id}/: Получение информации о произведении.
- PATCH /titles/{titles_id}/: Частично обновить информацию о произведении.
- DELETE /titles/{titles_id}/: Удалить произведение.

### Регистрация и аутентификация

Для аутентификации пользователей после регистрации используется access JWT-токен (Bearer, lifetime == 1 day)

Например:
1. Пользователь отправляет POST-запрос на добавление нового пользователя с параметрами email и username на эндпоинт **/api/v1/auth/signup/**.
2. YaMDB отправляет письмо с кодом подтверждения (confirmation_code) на адрес email.
3. Пользователь отправляет POST-запрос с параметрами username и confirmation_code на эндпоинт **/api/v1/auth/token/**, в ответе на запрос ему приходит token (JWT-токен).

### Логика представления данных (Views)
Для обработки пользовательских запросов и представления данных моделей применяются ViewSets. Вьюсеты содержат в себе встроенную реализацию методов для 5 основных типов запросов.

Стандартные методы внутри вьюсетов:

- create: Создание экземпляра (POST запрос).
- retrieve: Получение экземпляра по идентификатору (GET запрос).
- list: Получение списка всех экземпляров (GET запрос).
- update: Обновление экземпляра целиком (PUT запрос).
- partial_update: Частичное обновление экземпляра (PATCH запрос).
- destroy: Удаление экземпляра (DELETE запрос).

В проекте использованы следующие вьюсеты:
- UserViewSet
- NameSlugModelViewSet (базовая модель для наследования)
- GenreViewSet
- CategoryViewSet
- TitleViewSet
- ReviewViewSet
- CommentViewSet

Для более гибкой настройки отдельных вью применяются миксины и дженерики.

### Сериализаторы
Для каждого из из вью-классов и вьюсетов применяются свои сериализаторы данных.
- SignUpSerializer
- TokenSerializer
- UserSerializer
- GenreSerializer
- TitleSerializer
- CommentSerializer

Для представления данных из связанных таблиц (в ForeignKey-полях) в наглядном виде используются SlugRelatedField.

В сериализаторах происходит валидация данных конкретных полей, и совокупного payload.

В большинстве сериализаторов происходит наследование от serializers.ModelSerializer; в SignUpSerializer происходит наследование от serializers.Serializer, что позволяет реализовать логику обновления код подтверждения в эндпоинте регистрации /api/v1/auth/signup/.

### Пермишены

Во вьюсетах и вью-классах используются собственные классы пермишенов. Пермишены на уровне проекта отсутствуют.

## Документация и примеры работы АПИ

После успешного запуска проекта на локальной машине, необходимо перейти по ендпоинту /redoc/ для получения актуальной документации и примеров работы данного АПИ.

Примеры:
- Регистрация нового пользователя
Запрос http://127.0.0.1:8000/api/v1/auth/signup/
```
{
"email": "user@example.com",
"username": "^w\\Z"
}
```
Ответ
```
{
"email": "string",
"username": "string"
}
```
- Получение JWT-токена
Запрос http://127.0.0.1:8000/api/v1/auth/token/
```
{
"username": "^w\\Z",
"confirmation_code": "string"
}
```
Ответ
```
{
"token": "string"
}
```