API YaMDb - групповой учебный проект на Django REST Framework для сервиса, который собирает отзывы пользователей на произведения: книги, фильмы, музыку и другие категории.
В YaMDb не хранятся сами произведения: через API нельзя посмотреть фильм, прочитать книгу или послушать музыку. Проект хранит информацию о произведениях, категориях, жанрах, пользовательских отзывах, оценках и комментариях.
YaMDb решает задачу централизованного сбора пользовательских мнений о произведениях.
Пользователи могут:
- просматривать произведения, категории и жанры;
- читать отзывы и комментарии;
- регистрироваться и получать JWT-токен;
- оставлять один отзыв на одно произведение;
- ставить оценку произведению от 1 до 10;
- комментировать отзывы других пользователей;
- редактировать и удалять собственные отзывы и комментарии.
Модераторы могут редактировать и удалять любые отзывы и комментарии.
Администраторы могут управлять пользователями, категориями, жанрами и произведениями.
Рейтинг произведения формируется на основе пользовательских оценок.
- регистрация пользователей по
usernameиemail; - отправка кода подтверждения
confirmation_codeна email; - получение JWT-токена по
usernameиconfirmation_code; - ролевая модель доступа:
user,moderator,admin; - управление пользователями через API;
- CRUD для произведений;
- создание и удаление категорий и жанров;
- создание, просмотр, редактирование и удаление отзывов;
- создание, просмотр, редактирование и удаление комментариев;
- ограничение: один пользователь может оставить только один отзыв на одно произведение;
- оценка произведения целым числом от 1 до 10;
- фильтрация произведений по категории, жанру, названию и году;
- поиск по категориям, жанрам и пользователям;
- пагинация ответов;
- импорт начальных данных из CSV-файлов;
- документация API через ReDoc.
- Python
- Django
- Django REST Framework
- Simple JWT
- django-filter
- SQLite
- pytest
- Postman
| Роль | Права |
|---|---|
| Аноним | Может читать произведения, категории, жанры, отзывы и комментарии. |
user |
Может читать всё, создавать отзывы и комментарии, редактировать и удалять свои отзывы и комментарии. |
moderator |
Имеет права пользователя, а также может редактировать и удалять любые отзывы и комментарии. |
admin |
Имеет полные права на управление пользователями, категориями, жанрами и произведениями. |
| Суперпользователь Django | Всегда обладает правами администратора. |
git clone https://github.com/psa88/api-yamdb.git
cd api-yamdbДля Windows PowerShell:
python -m venv venv
.\venv\Scripts\Activate.ps1Для macOS/Linux:
python3 -m venv venv
source venv/bin/activatepython -m pip install --upgrade pip
pip install -r requirements.txtcd api_yamdbpython manage.py migrateВ проекте подготовлены CSV-файлы с начальными данными. Они находятся в директории:
api_yamdb/static/data/
Для загрузки данных выполните команду:
python manage.py load_csvКоманда загружает данные из файлов:
users.csv;category.csv;genre.csv;titles.csv;genre_title.csv;review.csv;comments.csv.
python manage.py createsuperuserpython manage.py runserverПосле запуска проект будет доступен по адресу:
http://127.0.0.1:8000/
Документация API доступна по адресу:
http://127.0.0.1:8000/redoc/
Проект может работать без отдельного .env, так как в настройках предусмотрены значения по умолчанию. При необходимости можно создать файл .env в директории api_yamdb/:
SECRET_KEY=your-secret-key
DEBUG=TrueВ проекте используется консольный backend для email:
EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'Поэтому код подтверждения при регистрации выводится в терминал, где запущен сервер.
Все запросы к API начинаются с префикса:
/api/v1/
| Ресурс | Эндпоинт | Описание |
|---|---|---|
| Auth | /api/v1/auth/signup/ |
Регистрация пользователя и получение кода подтверждения. |
| Auth | /api/v1/auth/token/ |
Получение JWT-токена. |
| Users | /api/v1/users/ |
Управление пользователями. Доступно администратору. |
| Users | /api/v1/users/me/ |
Просмотр и редактирование собственного профиля. |
| Categories | /api/v1/categories/ |
Получение списка и создание категорий. |
| Genres | /api/v1/genres/ |
Получение списка и создание жанров. |
| Titles | /api/v1/titles/ |
Получение списка и создание произведений. |
| Reviews | /api/v1/titles/{title_id}/reviews/ |
Отзывы к произведению. |
| Comments | /api/v1/titles/{title_id}/reviews/{review_id}/comments/ |
Комментарии к отзыву. |
Ниже приведены примеры запросов через curl.
Запрос:
curl -X POST http://127.0.0.1:8000/api/v1/auth/signup/ \
-H "Content-Type: application/json" \
-d '{"email": "user@example.com", "username": "new_user"}'Пример ответа:
{
"email": "user@example.com",
"username": "new_user"
}После запроса код подтверждения будет выведен в консоль сервера.
Запрос:
curl -X POST http://127.0.0.1:8000/api/v1/auth/token/ \
-H "Content-Type: application/json" \
-d '{"username": "new_user", "confirmation_code": "your_confirmation_code"}'Пример ответа:
{
"token": "jwt_token"
}Далее токен нужно передавать в заголовке Authorization:
Authorization: Bearer <jwt_token>
Запрос:
curl http://127.0.0.1:8000/api/v1/titles/Пример ответа:
{
"count": 1,
"next": null,
"previous": null,
"results": [
{
"id": 1,
"name": "Побег из Шоушенка",
"year": 1994,
"rating": 9,
"description": "Описание произведения",
"genre": [
{
"name": "Драма",
"slug": "drama"
}
],
"category": {
"name": "Фильм",
"slug": "movie"
}
}
]
}Запрос:
curl -X POST http://127.0.0.1:8000/api/v1/categories/ \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <admin_token>" \
-d '{"name": "Книги", "slug": "books"}'Пример ответа:
{
"name": "Книги",
"slug": "books"
}Запрос:
curl -X POST http://127.0.0.1:8000/api/v1/titles/ \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <admin_token>" \
-d '{
"name": "Марсианские хроники",
"year": 1950,
"description": "Сборник рассказов Рэя Брэдбери.",
"genre": ["sci-fi"],
"category": "books"
}'Пример ответа:
{
"id": 1,
"name": "Марсианские хроники",
"year": 1950,
"rating": null,
"description": "Сборник рассказов Рэя Брэдбери.",
"genre": [
{
"name": "Фантастика",
"slug": "sci-fi"
}
],
"category": {
"name": "Книги",
"slug": "books"
}
}Запрос:
curl -X POST http://127.0.0.1:8000/api/v1/titles/1/reviews/ \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <user_token>" \
-d '{"text": "Отличное произведение.", "score": 10}'Пример ответа:
{
"id": 1,
"text": "Отличное произведение.",
"author": "new_user",
"score": 10,
"pub_date": "2026-04-28T12:00:00Z"
}Запрос:
curl -X POST http://127.0.0.1:8000/api/v1/titles/1/reviews/1/comments/ \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <user_token>" \
-d '{"text": "Полностью согласен с отзывом."}'Пример ответа:
{
"id": 1,
"text": "Полностью согласен с отзывом.",
"author": "new_user",
"pub_date": "2026-04-28T12:05:00Z"
}Произведения можно фильтровать по категории, жанру, названию и году:
GET /api/v1/titles/?category=movie
GET /api/v1/titles/?genre=drama
GET /api/v1/titles/?name=марсианские
GET /api/v1/titles/?year=1950
Для категорий, жанров и пользователей доступен поиск:
GET /api/v1/categories/?search=книги
GET /api/v1/genres/?search=драма
GET /api/v1/users/?search=admin
Из корня проекта выполните:
pytestflake8В директории postman_collection/ находится коллекция запросов:
postman_collection/Ymdb-collection.postman_collection.json
Для подготовки базы данных к запуску коллекции можно использовать скрипт:
cd postman_collection
bash set_up_data.shCкрипт очищает текущую базу данных и создаёт пользователей, необходимые для проверки API через Postman.
Подробная инструкция находится в файле:
postman_collection/README.md
В проекте реализованы связи между объектами:
- при удалении пользователя удаляются его отзывы и комментарии;
- при удалении произведения удаляются отзывы к нему и комментарии к этим отзывам;
- при удалении отзыва удаляются комментарии к нему;
- при удалении категории связанные произведения не удаляются;
- при удалении жанра связанные произведения не удаляются.