Можно найти по адресу: https://foodgramyp.ru/
Foodgram — это онлайн-сервис для публикации рецептов, добавления их в избранное и список покупок, а также для подписки на любимых авторов. Сервис позволяет быстро спланировать рацион и сформировать список покупок.
-Python 3.12 -Django & Django REST Framework -PostgreSQL -Docker & Docker Compose -Nginx -Gunicorn -JWT (Djoser) -React (фронтенд) -GitHub Actions (CI/CD)
- Клонируйте репозиторий и перейдите в него:
git clone https://github.com/Serieznee-nekuda17/foodgram.git
cd foodgram- Создайте .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- Соберите и запустите проект в Docker:
docker compose -f docker-compose.production.yml up -d --build- Выполните миграции и соберите статику:
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
Документация доступна после запуска проекта по адресу:
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": "шт."
}
]
Проект автоматически:
Проверяется линтером flake8 Собирает и пушит образы на Docker Hub Деплоится на удалённый сервер Отправляет уведомление в Telegram Настроено с помощью GitHub Actions и main.yml в .github/workflows/.