Skip to content

8-mile-code/foodgram

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

47 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

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

Можно найти по адресу: https://foodgramyp.ru/

Описание

Foodgram — это онлайн-сервис для публикации рецептов, добавления их в избранное и список покупок, а также для подписки на любимых авторов. Сервис позволяет быстро спланировать рацион и сформировать список покупок.

Технологии

-Python 3.12 -Django & Django REST Framework -PostgreSQL -Docker & Docker Compose -Nginx -Gunicorn -JWT (Djoser) -React (фронтенд) -GitHub Actions (CI/CD)

  1. Клонируйте репозиторий и перейдите в него:
git clone https://github.com/Serieznee-nekuda17/foodgram.git
cd foodgram
  1. Создайте .env файл по образцу и укажите переменные окружения:
DB_ENGINE=django.db.backends.postgresql
DB_NAME=postgres
POSTGRES_USER=postgres
POSTGRES_PASSWORD=postgres
DB_HOST=db
DB_PORT=5432
SECRET_KEY=your_secret_key
DEBUG=False
ALLOWED_HOSTS=localhost,127.0.0.1
  1. Соберите и запустите проект в Docker:
docker compose -f docker-compose.production.yml up -d --build
  1. Выполните миграции и соберите статику:
docker compose -f docker-compose.production.yml exec backend python manage.py migrate
docker compose -f docker-compose.production.yml exec backend python manage.py collectstatic --no-input

Как наполнить БД "ингридиентами"

В репозитории уже лежит файл‑фикстура data/ingredients.json и кастомная management‑команда import_ingredients (см. backend/recipes/management/commands/import_ingredients.py).

После запуска контейнеров выполните команду:

docker compose -f docker-compose.production.yml exec backend \
python manage.py import_ingredients

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

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

http://localhost/api/docs/

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

Аутентификация

Регистрация: POST /api/users/

{
  "email": "vpupkin@yandex.ru",
  "username": "vasya.pupkin",
  "first_name": "Вася",
  "last_name": "Иванов",
  "password": "Qwerty123"
}

ответ: { "email": "vpupkin@yandex.ru", "id": 1, "username": "vasya.pupkin", "first_name": "Вася", "last_name": "Иванов" }

Получение токена: POST /api/auth/token/login/

{
  "email": "vpupkin@yandex.ru",
  "password": "Qwerty123"
}

ответ:

{
  "auth_token": "b1a2c3..."
}

Удаление токена: POST /api/auth/token/logout/ (без тела запроса) ответ: 204 No Content

Пользователи

Список пользователей: GET /api/users/

{
  "count": 1,
  "next": null,
  "previous": null,
  "results": [
    {
      "id": 1,
      "email": "vpupkin@yandex.ru",
      "username": "vasya.pupkin",
      "first_name": "Вася",
      "last_name": "Иванов",
      "is_subscribed": false,
      "avatar": "http://localhost/media/users/avatar.jpg"
    }
  ]
}

Профиль текущего: GET /api/users/me/

{
  "id": 1,
  "email": "vpupkin@yandex.ru",
  "username": "vasya.pupkin",
  "first_name": "Вася",
  "last_name": "Иванов",
  "is_subscribed": false,
  "avatar": "http://localhost/media/users/avatar.jpg"
}

Подписка: POST /api/users/{id}/subscribe/

{
  "id": 2,
  "email": "author@example.com",
  "username": "author",
  "first_name": "Автор",
  "last_name": "Писатель",
  "is_subscribed": true,
  "recipes": [
    {
      "id": 1,
      "name": "Борщ",
      "image": "http://localhost/media/recipes/image.jpg",
      "cooking_time": 60
    }
  ],
  "recipes_count": 1,
  "avatar": "http://localhost/media/users/avatar.jpg"
}

Мои подписки: GET /api/users/subscriptions/

{
  "count": 1,
  "next": null,
  "previous": null,
  "results": [
    {
      "id": 2,
      "email": "author@example.com",
      "username": "author",
      "first_name": "Автор",
      "last_name": "Писатель",
      "is_subscribed": true,
      "recipes": [...],
      "recipes_count": 1,
      "avatar": "http://localhost/media/users/avatar.jpg"
    }
  ]
}

Рецепты

Список рецептов: GET /api/recipes/

{
  "count": 1,
  "next": null,
  "previous": null,
  "results": [
    {
      "id": 1,
      "name": "Борщ",
      "text": "Очень вкусный борщ",
      "image": "http://localhost/media/recipes/image.jpg",
      "cooking_time": 60,
      "is_favorited": true,
      "is_in_shopping_cart": false,
      "tags": [
        {
          "id": 1,
          "name": "Ужин",
          "slug": "dinner"
        }
      ],
      "author": {
        "id": 2,
        "username": "author",
        "first_name": "Автор",
        "last_name": "Писатель",
        "is_subscribed": true
      },
      "ingredients": [
        {
          "id": 1,
          "name": "Свёкла",
          "measurement_unit": "шт.",
          "amount": 2
        }
      ]
    }
  ]
}

Создание рецепта: POST /api/recipes/

{
  "ingredients": [
    {"id": 1, "amount": 2}
  ],
  "tags": [1],
  "image": "data:image/png;base64,...",
  "name": "Борщ",
  "text": "Очень вкусный борщ",
  "cooking_time": 60
}

ответ:

{
  "id": 1,
  "name": "Борщ",
  "text": "Очень вкусный борщ",
  "image": "http://localhost/media/recipes/image.jpg",
  "cooking_time": 60,
  ...
}

Список покупок

Скачивание списка покупок: GET /api/recipes/download_shopping_cart/ ответ: файл .txt с содержание вида:

Свёкла — 2 шт.
Картофель — 3 шт.

Теги и ингредиенты

Список тегов: GET /api/tags/

[
  {
    "id": 1,
    "name": "Завтрак",
    "slug": "breakfast"
  }
]

Список ингредиентов: GET /api/ingredients/?name=лук

[
  {
    "id": 1,
    "name": "Лук репчатый",
    "measurement_unit": "шт."
  }
]

CI/CD

Проект автоматически:

Проверяется линтером flake8 Собирает и пушит образы на Docker Hub Деплоится на удалённый сервер Отправляет уведомление в Telegram Настроено с помощью GitHub Actions и main.yml в .github/workflows/.

Автор:

Богатов Данил

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors