Skip to content

Repository files navigation

Foodgram — продуктовый помощник

Платформа для публикации рецептов. Пользователи могут публиковать свои рецепты, добавлять чужие рецепты в избранное и подписываться на публикации других авторов. Зарегистрированным пользователям также доступен список покупок, который позволяет создавать список продуктов, которые нужно купить для приготовления выбранных блюд.

Стек технологий

  • Python 3.12+

  • Django 4.2

  • Django REST Framework 3.14

  • Djoser

  • PostgreSQL

  • Docker, docker compose

  • Nginx, Gunicorn

  • React

  • Postman Collection

  • Git и GitHub

Как запустить локально

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

git clone git@github.com:0den7/foodgram.git
cd foodgram

Перейти в папку backend/, создать и активировать виртуальное окружение:

cd backend/
python -m venv venv
source venv/Scripts/activate

Установить зависимости из файла requirements.txt:

python -m pip install --upgrade pip
pip install -r requirements.txt

Создать файл .env в корне проекта (см. .env.example). Применить миграции:

python manage.py migrate

Запустить проект:

python manage.py runserver

Проект будет доступен по адресу http://127.0.0.1:8000/.

Как запустить через Docker

Создать файл .env в корне проекта (см. .env.example). Из корня проекта перейти в папку infra/ и выполнить команду:

docker compose up -d

Выполнить миграции, собрать статику, загрузить ингредиенты и создать суперюзера:

docker compose exec backend python manage.py migrate
docker compose exec backend python manage.py collectstatic --noinput
docker compose exec backend sh -c "cp -r /app/static/. /backend_static/static/"
docker compose exec backend python manage.py load_ingredients
docker compose exec backend python manage.py createsuperuser

Проект будет доступен по адресу http://localhost/.

Для запуска на сервере используется docker-compose.production.yml:

docker compose -f docker-compose.production.yml up -d

Деплой

Проект развёрнут на удалённом сервере и доступен по адресу https://foodgram.3utilities.com.

Наполнение базы данных ингредиентами

В проекте есть management-команда для импорта данных из JSON-файла:

python manage.py load_ingredients

Файл для импорта находятся в папке /foodgram/data/.

Документация API

После запуска проекта документация доступна по адресу:

http://localhost/api/docs/

Примеры запросов

Регистрация пользователя

Запрос:

POST https://foodgram.3utilities.com/api/users/
Content-Type: application/json

{
    "email": "user@example.com",
    "username": "new_user",
    "first_name": "Иван",
    "last_name": "Иванов",
    "password": "SecurePass123"
}

Ответ (201 Created):

{
    "email": "user@example.com",
    "id": 1,
    "username": "new_user",
    "first_name": "Иван",
    "last_name": "Иванов"
}

Получение токена авторизации

Запрос:

POST https://foodgram.3utilities.com/api/auth/token/login/
Content-Type: application/json

{
    "email": "user@example.com",
    "password": "SecurePass123"
}

Ответ (200 OK):

{
    "auth_token": "string"
}

Создание рецепта

Запрос:

POST https://foodgram.3utilities.com/api/recipes/
Authorization: Token <auth_token>
Content-Type: application/json

{
    "ingredients": [
        {"id": 1, "amount": 10}
    ],
    "tags": [
        1
    ],
    "image": "data:image/png;base64,iVBORw0KGgoAAAANS...",
    "name": "Борщ",
    "text": "Сварить овощи, добавить мясо...",
    "cooking_time": 60
}

Ответ (201 Created):

{
    "id": 1,
    "tags": [
        {"id": 1, "name": "Завтрак", "slug": "breakfast"}
    ],
    "author": {
        "email": "user@example.com",
        "id": 1,
        "username": "new_user",
        "first_name": "Иван",
        "last_name": "Иванов",
        "is_subscribed": false,
        "avatar": "https://foodgram.3utilities.com/media/users/image.png"
    },
    "ingredients": [
        {"id": 1, "name": "Картофель", "measurement_unit": "г", "amount": 10}
    ],
    "is_favorited": false,
    "is_in_shopping_cart": false,
    "name": "Борщ",
    "image": "https://foodgram.3utilities.com/media/recipes/images/image.png",
    "text": "Сварить овощи, добавить мясо...",
    "cooking_time": 60
}

Скачивание списка покупок

Запрос:

GET https://foodgram.3utilities.com/api/recipes/download_shopping_cart/
Authorization: Token <auth_token>

Ответ:

В ответ вернётся файл shopping_cart.txt с перечнем и количеством ингредиентов.

Права доступа

  • Гость (анонимный пользователь): просмотр рецептов на главной, просмотр отдельных страниц рецептов, просмотр страниц пользователей, создание аккаунта, фильтрация рецептов по тегам
  • Авторизованный пользователь: вход в систему под своим логином и паролем, выход из системы, создание, редактирование и удаление собственных рецептов, просмотр страниц пользователей, просмотр рецептов на главной, просмотр отдельных страниц рецептов, работа с персональным списком покупок: добавление и удаление любых рецептов, выгрузка файла с количеством необходимых ингредиентов для рецептов из списка покупок, работа с персональным списком избранного: добавление в него рецептов или удаление их, просмотр своей страницы избранных рецептов, подписка на публикации авторов рецептов и отмена подписки, просмотр своей страницы подписок
  • Администратор: все права авторизованного пользователя + изменение пароля любого пользователя, создание, блокировка и удаление аккаунтов пользователей, редактирование и удаление любых рецептов, добавление, удаление и редактирование ингредиентов, добавление, удаление и редактирование тегов (через админ-панель Django)

Автор

Юрий Кудряшов

GitHub: 0den7

About

Foodgram — платформа для публикации рецептов с системой подписок, избранного и автогенерацией списка покупок

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Contributors

Languages