В данной статье я опишу процесс объединения React и Django под одним проектом. Мы настроим API для общения обоих между собой, а так же подключим TailwindCSS библиотеку, дабы упростить создание сайта ещё сильнее.
Корневая директория будет называться SearchResultParser. В ней создайте новый django проект. Он тоже будет иметь название SearchResultParser. После установки базового проекта, можно перейти к созданию первого приложения для данного проекта.
Добавление приложения к Django проекту
Игнорируй всё ниже описанное в данной главе, если ты хочешь просто подключить react к django и создать своё приложение.
Перед тем как ты перейдёшь по ссылке в заголовке, ты должен знать, что название у приложения будет Main, а название модели в ней будет Result, для админки модель будет называться ResultAdmin. И ты должен будешь добавить следующие поля в неё:
user (CharField)
file (FileField)
time_created (DateTimeField)
Настройка API для общения между React и Django
Установка APIs
В файле settings.py, необходимо будет добавить ново установленные приложения, coreheaders и rest_framework в INSTALLED_APP, а так же добавить одну мидлвари corsheaders.middleware.CorsMiddleware в MIDDLEWARE список.
Добавь следующие строчки внизу файла settings.py
Создание cериализатора для модели
Чтобы фронтенд мог работать с моделями, необходимо их как-то получать. Для этого я создам сериализатор(экспортёр), который превратит отправляемые бэкендом записи баз данных, в json файлы.
Создай новый файл в директории приложения Main.
Добавь следующий контент:
Подготовка и настройка APIs
В файле Main/views.py добавим новое представление для API. Файл будет выглядеть так:
В файле SearchResultParser/urls.py нужно будет создать роутер и подключить новые пути.
Вот новое содержимое файла:
После всего этого у тебя появятся следующие адреса для навигации:
localhost:8000/api/results – Здесь ты можешь просмотреть все записи в твоей базе данных
localhost:8000/api/results/1/ - Так ты можешь просмотреть одну единственную запись, 1 это id записи
Создание базового проекта для React
Я создал react проект в корневой директории, где .venv и назвал его searchresultparser-frontend.
Устанавливаем и подключаем TailwindCSS к проекту (опционально)
Опционально, если хотите использовать что-нибудь другое.
Заходим в директорию react проекта:
Установим пакет
Создадим файл конфигурации (tailwind.config.js) и отредактируем его
Замени содержание файла searchresultparser-frontend/tailwind.config.js на
Добавим базовые директивы в searchresultparser-frontend/src/index.css
Начнём сборку и запустим проект
Теперь библиотека tailwindcss готова к использованию.
Создадим базовый интерфейс на React
Модальное окно
В директории searchresultparser-frontend/src/ создайте новый файл.
Данный файл описывает, появление и вид модального окна. Которое нам потребуется в будущем для отправки различных запросов к API нашего сайта. Вставьте следующий код в файл Modal.js:
Страница приложения
Следующий «кусочек» кода описывает базовый интерфейс для общения с сервером и выполнения таких базовых операций как CRUD. Откройте файл App.js и вместо кода по умолчанию вставьте следующий код:
Опять же, не особо зацикливайтесь на данном «кусочке» кода, мы его всё равно в следующей главе будем менять и препарировать. Вот так.
Соединение React и Django
Axios или fetch ?
После того как с фронтендом и бэкендом было покончено, нам необходимо их как-то связать. Для это предлагаю использовать javascript библиотеку axios.
Почему не fetch, а axios ?
Лично я выбрал axios потому что мне понравился его синтаксис, он просто элегантней и ещё одно, он поддерживает старые браузеры и их версии. Вот. Но я так же прикреплю таблицу их сравнения, что бы вы смогли сами решить что из этого лучше.
Фичи
fetch
axios
Доступность
Встроенный
Требуется установка
Синтакс
Подробный, более шаблонный
Краткий, удобный для пользователя
Обратка JSON
Ручная
Автоматическая
Обработка ошибок
Ручная
Встроенная
Наличие перехватчиков
Не доступно
Доступно
Закрытие запросов
Не доступно
Доступно
Поддержка браузеров
Только современные браузеры
Поддержка старых версий доступна
Установим и настроим axios.
После установки в файл package.json можно добавить путь до нашего сервера. Вставьте это значение:
Это вообще не обязательно, но позволяет не писать лишний раз полный адрес вашего сервера. Меньше кода, меньше ошибок.
Теперь осталось только указать, где и откуда мы собираемся обращаться к API нашего приложения.
Пошагово, с комментариями меняем код для App.js
Импорты и переменные состояния
Во-первых, импортируем функцию из react: useEffect . Во-вторых, импортируем сам axios. В-третьих, уберём var items. Итого, до определения функции App у нас будет только 3 импорта, вот так:
Все последующие куски кода будут вставляться в функцию App
В начале, объявляем необходимые переменные и привязываем к ним функции для их изменения.
Модальное окно
Для появления и скрытия модального окна, добавим следующие функции:
Они работают таким образом, что при изменении переменной isModal, модальное окно будет либо появляться, либо исчезать.
Отрисовка списка
Давай сразу вставим код, который будет отрисовывать наш список. Этот код мы вставим в конце функции App.
Отрисовка модального окна, CRUD
Как видно из шаблона отрисовки списка, есть такие функции как:
createItem
editItem
deleteItem
Идея этих функций проста. При нажатии одной из кнопок, к которым данные функции присоединены, будет вставлена соответствующая форма в компонент Modal.
Вставь их выше return.
Обновление данных форм
В данных формах за обновление данных отвечает функция handleChange
Общение с сервером
За непосредственную отправку запросов на сервер отвечают функции:
editingSubmit
creationSubmit
deletionSubmit
Они и отвечают за правильное использование axios библиотеки или fetch API
Функция creationSubmit отправляет POST запросы по адресу /api/results/ . Она сохраняет и отправляет введённые данные и триггерит обновление списка.
axios
fetch
Функция editingSubmit отправляет PUT запросы по адресу /api/results/{ID} . Она сохраняет и отправляет введённые данные и триггерит обновление списка.
axios
fetch
Функция deletionSubmit отправляет DELETE запросы по адресу /api/results/{ID} . Тем самым удаляя из списка соответствующую запись по ID. Так же в конце триггерит обновление списка.
axios
fetch
Обновление списка
До этого момента я писал о том что функции триггерят обновление списка. В чём дело, а дело в функции useEffect. В моём случае эта функция вызывает handleUpdate, только тогда когда переменная состояния isUpdate (смотри выше) изменена. И меняется она в функциях подтверждения удаления, изменения и добавления записей в базу данных.
axios
fetch
Вставь вызов функции useEffect перед самым началом return.
Если использовать useEffect без списка зависимостей (т. е. isUpdate в нашем случае ), react будет отправлять запросы об обновлении списка постоянно, что конечно сильно нагружает сервер.
На этом всё. React приложение готово и оно успешно обменивается запросами с сервером.
Готовый код для App.js
axios
fetch
Заключение
Конечно, я не рассказал о том как деплоить данный проект на сервер, или то как react будет взаимодействовать с шаблонами от django. Конечно, для них будут отдельные статьи и всё со временем уляжеться. Ну а пока вот так.
В этой статье ты узнаешь как создать Django приложение и настроить его для работы с React JS чтобы получилось полноценное фулстак приложение. Так же в статье приведено видео-туториал и скачиваемые …
Буду занят разработкай нового проекта с кодовым названием SearchResultParser. Его суть в том, чтобы парсить данные из поисковой выдачи различных поисковых машин. Таких как google, youtube, yandex и прочих.
Здесь ты узнаешь как написать свой API используя Django REST API. Добавляется он для того, чтобы построить API для доступа со стороны клиента (фронтенда). Так же демонстрирую как данный API …
Использованные термины
Хостинг ⟶ Это услуга по предоставлению места на сервере и выделению, определённой заранее мощности ,этого сервера, с тем условием что этот сервер имеет постоянный доступ в интернет.
CORS (Cross-Origin Resource Sharing) ⟶ Это механизм, который позволяет ограничить ресурсы веб-страниц, чтобы они могли запросить ресурсы с других доменов. Поскольку правила безопасности браузеров по умолчанию блокируют такие запросы (из-за политики одинаковых источников), CORS предоставляет способ более безопасного доступа к ресурсам с других источников.
IP (Интернет протокол) ⟶ Это протокол, который используется для передачи данных по сети, включая Интернет. IP отвечает за адресацию и маршрутизацию пакетов данных между устройствами в сети.
TCP (Протокол управления передачей) ⟶ Это протокол транспортного уровня, который используется для обеспечения надежной передачи данных в сетях, включая Интернет. Он работает в паре с протоколом IP (Internet Protocol), что вместе образует стек TCP/IP.
Релевантные вопросы
Мое приложение некорректно отображается на сервере?
Если это не работает, в 99% случаев это проблема конфигурации. Отсутствующее свойство, неправильный порядок вызовов или отсутствующий компонент — серверный рендеринг строго относится к конфигурации. Лучший способ выяснить, что не так, — сравнить свой проект с уже работающей настройкой. Ознакомьтесь с эталонными реализациями по частям.
Я не переношу язык шаблонов Django. Мне обязательно его использовать?
Я думаю, что этот шаблонизатор — лучшее, что когда-либо было, но я знаю, что выбор языка шаблонов — это почти религия. В Django нет ничего, что требовало бы использования языка шаблонов, так что если вы привязаны к Jinja2, Mako или чему-то еще, то это нормально.
Как можно увидеть необработанные SQL-запросы, выполняемые Django?
Убедитесь, что настройка Django DEBUG установлена на True. Затем импортируйте соединение из django.db. connection.queries доступен только если DEBUG имеет значение True. Это список словарей в порядке выполнения запроса. Каждый словарь имеет свойство sql и time.
Если я внесу изменения в модель, как мне обновить базу данных?
Взгляните на поддержку Django для миграции схем. Если вы не против очистки данных, утилита manage.py вашего проекта имеет опцию сброса, чтобы сбросить базу данных в состояние, в котором она была сразу после выполнения миграции.