Проект «Фудграм» — сайт, на котором пользователи могут публиковать свои рецепты, добавлять чужие рецепты в избранное и подписываться на публикации других авторов. Зарегистрированным пользователям также доступен сервис «Список покупок», который позволяет создавать список продуктов для выбранных блюд и скачивать его.
Для полноценного запуска (бэкенд, фронтенд, база данных, nginx) используется Docker Compose.
Установите Docker Desktop:
Клонируйте репозиторий:
git clone git@github.com:your-username/foodgram-st.git
cd foodgram-stВ папке infra/ создайте файл .env.
Пример наполнения:
# Django
SECRET_KEY='...'
DEBUG=False
ALLOWED_HOSTS=localhost,127.0.0.1,backend
# Database
POSTGRES_DB=foodgram-db
POSTGRES_USER=postgres
POSTGRES_PASSWORD=postgres
DB_HOST=db
DB_PORT=5432Из папки с docker-compose.yml выполните команду:
docker compose up -d --buildПосле запуска команда docker container ls покажет следующую структуру:
- foodgram-proxy (Nginx) — входная точка приложения (порт 80)
- foodgram-backend (Django + Gunicorn) — API и админка
- foodgram-frontend — статический контейнер с React (завершает работу после сборки)
- foodgram-db (PostgreSQL) — база данных
Эти команды выполняются один раз после первого запуска контейнеров.
Загружаем список ингредиентов в базу данных из JSON-файла (используется кастомная команда):
docker compose exec backend python manage.py load_ingredientsСоздаем суперпользователя для доступа в админку:
docker compose exec backend python manage.py createsuperuserНиже приведены примеры использования основных эндпоинтов API.
Запрос для создания нового пользователя в системе. Не требует аутентификации.
Запрос:
curl -X POST \
http://127.0.0.1:8000/api/users/ \
-H 'Content-Type: application/json' \
-d '{
"email": "user@example.com",
"username": "string",
"first_name": "string",
"last_name": "string",
"password": "strong_password"
}'Ответ (Статус 201 Created):```json { "email": "user@example.com", "id": 1, "username": "string", "first_name": "string", "last_name": "string" }
---
#### 2. Получение токена аутентификации
После регистрации пользователь может получить токен для доступа к защищенным эндпоинтам.
**Запрос:**
```bash
curl -X POST \
http://127.0.0.1:8000/api/auth/token/login/ \
-H 'Content-Type: application/json' \
-d '{
"email": "user@example.com",
"password": "strong_password"
}'
Ответ (Статус 200 OK):
{
"auth_token": "9a4a7282155b5b5f2c27b0b61234567890abcdef"
}Аутентифицированный пользователь может создать новый рецепт, передав все необходимые данные, включая ингредиенты.
Запрос:
curl -X POST \
http://127.0.0.1:8000/api/recipes/ \
-H 'Authorization: Token 9a4a7282155b5b5f2c27b0b61234567890abcdef' \
-H 'Content-Type: application/json' \
-d '{
"ingredients": [
{ "id": 1, "amount": 100 },
{ "id": 5, "amount": 2 }
],
"tags": [1],
"image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAgMAAABieywaAAAACVBMVEUAAAD///9fX1/S0ecCAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAACklEQVQImWNoAAAAggCByxOyYQAAAABJRU5ErkJggg==",
"name": "Яичница с помидорами",
"text": "Подробное описание рецепта...",
"cooking_time": 10
}'В поле image передается изображение в формате Base64.
Ответ (Статус 201 Created): Возвращается полная информация о созданном рецепте.
Получение списка всех рецептов. Эндпоинт доступен всем пользователям. Аутентифицированные пользователи могут применять фильтры, например, для отображения только избранных рецептов.
Запрос:
curl -X GET \
'http://127.0.0.1:8000/api/recipes/?is_favorited=1&author=2' \
-H 'Authorization: Token 9a4a7282155b5b5f2c27b0b61234567890abcdef'Этот запрос вернет рецепты автора с id=2, которые текущий пользователь добавил в избранное.
Ответ (Статус 200 OK):
{
"count": 1,
"next": null,
"previous": null,
"results": [
{
"id": 15,
"name": "Омлет с сыром",
"image": "http://127.0.0.1:8000/media/recipes/images/omelet.png",
"cooking_time": 15,
// ... другие поля
}
]
}Аутентифицированный пользователь может скачать текстовый файл со списком всех ингредиентов из рецептов, добавленных в его корзину.
Запрос:
curl -X GET \
http://127.0.0.1:8000/api/recipes/download_shopping_cart/ \
-H 'Authorization: Token 9a4a7282155b5b5f2c27b0b61234567890abcdef' \
--output shopping_list.txtКоманда --output shopping_list.txt сохранит результат в файл.
Ответ (Статус 200 OK):
Браузер или cURL скачают файл shopping_list.txt со следующим содержимым:
Список покупок:
• Мука (г) — 100
• Помидор (шт) — 2
• Сыр (г) — 50
• Яйцо (шт) — 2
| Адрес | Описание |
|---|---|
| http://localhost/ | Главная страница сайта |
| http://localhost/admin/ | Панель администратора |
Связь с автором: Tg: @Fgcvvv mdsv@inbox.ru