https://github.com/belyashnikovatn/api_yamdb
Сервис для публикации отзывов на произведения разных категорий и жанров.
https://github.com/belyashnikovatn/api_yamdb
api django drf jwt python
Last synced: 6 months ago
JSON representation
Сервис для публикации отзывов на произведения разных категорий и жанров.
- Host: GitHub
- URL: https://github.com/belyashnikovatn/api_yamdb
- Owner: belyashnikovatn
- Created: 2024-07-29T17:23:07.000Z (almost 2 years ago)
- Default Branch: master
- Last Pushed: 2024-08-08T18:46:02.000Z (almost 2 years ago)
- Last Synced: 2025-01-20T05:56:23.619Z (over 1 year ago)
- Topics: api, django, drf, jwt, python
- Language: Python
- Homepage:
- Size: 215 KB
- Stars: 1
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
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"
}
```