1. Создание надежного API с помощью Django и Django REST Framework
Создание надежного API с помощью Django и Django REST Framework
Добро пожаловать в курс «Fullstack-разработка: Django REST Framework и React». В этой серии статей мы пройдем путь от создания пустого проекта до развертывания полноценного веб-приложения, где мощный бэкенд на Python встречается с динамичным фронтендом на JavaScript.
В первой статье мы сосредоточимся на фундаменте нашего приложения — серверной части (Backend). Мы разберем, как спроектировать и реализовать API (Application Programming Interface), который будет служить надежным источником данных для нашего будущего интерфейса на React.
Зачем нам связка Django и React?
Традиционно Django использовался как монолитный фреймворк: он обрабатывал запросы, обращался к базе данных и сам генерировал HTML-страницы, которые отправлялись пользователю. Этот подход называется Server-Side Rendering (SSR).
Однако современные веб-приложения требуют мгновенного отклика интерфейса, работы без перезагрузки страницы и сложной логики на стороне клиента. Здесь на сцену выходит React. Но React — это библиотека, работающая в браузере. Ей нужны данные. Она не может напрямую подключиться к вашей базе данных SQL по соображениям безопасности и архитектуры.
Именно здесь появляется Django REST Framework (DRF). Он превращает Django из генератора HTML в генератора данных (обычно в формате JSON). React запрашивает данные, Django их отдает, а React сам решает, как их отобразить.
Подготовка окружения
Прежде чем писать код, нам нужно подготовить рабочее место. Мы будем использовать Python, поэтому убедитесь, что он установлен на вашем компьютере. Хорошей практикой является использование виртуального окружения, чтобы зависимости проекта не конфликтовали с другими проектами.
Создадим папку проекта и виртуальное окружение:
Активируем его (команда зависит от вашей ОС):
* Windows: venv\Scripts\activate
* macOS/Linux: source venv/bin/activate
Теперь установим Django и Django REST Framework:
Создадим сам проект Django и первое приложение, которое мы назовем api:
Обратите внимание на точку в конце первой команды — она создает проект в текущей папке, не создавая лишней вложенности.
Настройка проекта
Теперь нам нужно «сообщить» Django о том, что мы установили DRF и создали приложение api. Откройте файл backend/settings.py и найдите список INSTALLED_APPS. Добавьте туда наши компоненты:
Проектирование модели данных
Любое API начинается с данных. Допустим, мы создаем приложение для ведения заметок. Нам нужна модель Note.
Откройте файл api/models.py и создайте структуру нашей таблицы:
Здесь мы определили три поля:
title: заголовок заметки (строка ограниченной длины).content: текст заметки (текстовое поле неограниченной длины).created_at: дата и время создания (заполняется автоматически при создании).После создания модели необходимо создать миграции и применить их к базе данных:
Магия сериализации
Это один из самых важных разделов статьи. База данных хранит информацию в своем формате. Python работает с объектами классов. А React (JavaScript) понимает формат JSON (JavaScript Object Notation).
Сериализация — это процесс перевода данных из сложных структур (например, объектов моделей Django) в формат, который можно легко передать по сети (например, JSON) и сохранить.
Десериализация — обратный процесс: получение JSON от клиента и превращение его в объект Python для сохранения в базу данных.
В Django REST Framework за это отвечают Сериализаторы. Создайте файл api/serializers.py:
Класс ModelSerializer делает за нас огромную работу. Он автоматически анализирует модель Note и создает поля для сериализатора, соответствующие полям модели.
Создание представлений (Views)
Теперь, когда мы умеем превращать данные в JSON, нам нужно создать эндпоинты (точки входа), к которым будет обращаться React. В DRF есть множество способов написать представления, но самый быстрый и чистый для стандартных задач — использование Generic Views.
Мы хотим реализовать две функции:
Откройте api/views.py:
Посмотрите, насколько лаконичен код. Наследуясь от ListCreateAPIView, мы автоматически получаем логику для обработки GET-запросов (вернуть список) и POST-запросов (создать запись). Аналогично RetrieveUpdateDestroyAPIView берет на себя всю рутину по поиску объекта по ID, его обновлению или удалению.
Настройка маршрутизации (URLs)
Последний шаг — связать наши представления с URL-адресами. Сначала создадим файл api/urls.py (его изначально нет):
Теперь подключим URL-адреса приложения api к главному файлу маршрутизации проекта backend/urls.py:
Тестирование API
Запустим сервер разработки:
Теперь, если вы перейдете в браузере по адресу http://127.0.0.1:8000/api/notes/, вы увидите не просто JSON, а Browsable API (интерактивный API) — мощный инструмент DRF. Это веб-страница, которая позволяет вам:
Попробуйте ввести заголовок и текст в форму и нажать кнопку POST. Вы увидите, как новая запись добавилась в базу данных и отобразилась в списке.
!Интерфейс Browsable API позволяет тестировать запросы прямо в браузере без написания фронтенда.
Как это работает под капотом?
Когда вы отправляете данные через форму:
urls.py, который направляет его в NoteListCreate view.NoteSerializer.save() модели Note.201 Created.CORS: Подготовка к встрече с React
Есть один нюанс, который часто вызывает головную боль у новичков. Браузеры имеют механизм безопасности, называемый CORS (Cross-Origin Resource Sharing). Он запрещает сайту на одном домене (например, наш React будет на localhost:3000) делать запросы к сайту на другом домене (наш Django на localhost:8000), если сервер явно это не разрешит.
Чтобы подружить их, установим специальную библиотеку:
Добавим её в settings.py:
Теперь наш API полностью готов к приему гостей.
Заключение
Мы создали надежный фундамент для нашего приложения. Мы настроили Django, подключили Django REST Framework, описали структуру данных и создали точки входа API, которые умеют читать и записывать информацию. Более того, мы подготовили сервер к безопасной коммуникации с внешним фронтендом.
В следующей статье мы переключимся на фронтенд-разработку: создадим приложение на React и научим его отображать данные, которые мы только что подготовили.