Привет) перед тем, как приступать к достаточно объемному туториалу по Django, перевел небольшую статью, объясняющую азы шаблона Модель-Представление-Контроллер(Model-View-Controller) на примере конструктора лего.
_____________________________________________________________________________________
Чтобы продемонстрировать как веб приложения используют паттерн Модель-Представление-Контроллер(MVC) на практике, давайте отправимся в небольшое путешествие к глубинам вашей памяти.
Лего!
Итак, вам 10 лет. Вы сидите в зале на полу перед рассыпанным набором лего. Все детали разных цветов и размеров. Некоторые длинные, тонкие и голубые. Как тракторный прицеп. Некоторые красные и практически квадратные. Какие-то из них желтые, большие и плоские, они чем-то напоминают вам листы стекла. Деталей так много, что невозможно предсказать заранее, что из этого получится.
И тут совершенно внезапно вы получаете запрос (request). Ваш старший брат залетает в комнату и говорит: «Построй мне космический корабль!»
«Окей?» вы думаете, «может выйти действительно круто!». Все-таки это космический корабль.
Итак, вы принимаетесь за работу. Вытаскиваете из общей кучи детальки лего, которые подходят. Маленькие, большие, все различных цветов для обшивки и для механизмов корабля. И конечно нужно взять совершенно другие для бластеров. (У вас же есть бластеры!) Через какое-то время все ваши строительные блоки найдены, а значит время приступать к сборке. И вот, после нескольких часов работы, он стоит перед вами — ваш космический корабль!
Вы бежите быстрее показать брату законченный продукт. «Ухты, неплохо!» говорит он немного нахмурясь «Хм. Я просто попросил об этом несколько часов назад и вот он! Как бы хотелось, чтобы все было так легко.»
Что если я скажу вам, что создавать веб приложения — абсолютно то же самое, что и собирать лего?
Все начинается с запроса…
В случае с лего, ваш брат попросил вас что-то построить. В случае веб приложения, это пользователь вводит определенный URL, запрашивая у вас какую-то страницу.
Так что ваш брат — пользователь.
Запрос достиг контроллера…
В случае с лего — вы контроллер.
Контроллер ответственен за процесс сбора всех необходимых строительных блоков и организовать их правильно.
Наши детали - это модели…
Различные типы моделей — это детали конструктора лего. У вас есть различные типы и размеры, остается только схватить необходимую, чтобы построить свой космический корабль. В веб приложении модели помогают контроллеру получить необходимую информацию из баз данных.
Итак, запрос приходит…
Контроллер(вы) получил запрос.
Он приходит к моделям (лего), чтобы вернуть необходимые детали.
После этого все размещается на заготовленных местах, чтобы создать финальный продукт.
Финальным продуктом будет представление…
Космический корабль — это представление. Это финальный продукт, который в конечном счете и будет показан пользователю, отправившему вам запрос (вашему брату).
В веб приложении, представление — это финальная страница, которую видит пользователь в своем браузере.
Подведем итог…
В случае с лего:
- ваш брат делает запрос на постройку космического корабля.
- вы получаете запрос
- вы собираете и сортируете все детали лего, которые необходимы для постройки
- вы используете лего, чтобы собрать космический корабль и показать его своему заказчику-брату
В веб приложении:
- пользователь запрашивает представление страницы с помощью ввода URL
- Контроллер получает запрос
- Контроллер использует Модели чтобы собрать все необходимые данные, отсортировать их и отправить в…
- Представление, которое использует данные, чтобы отрендерить конечную веб-страницу, которая будет показана пользователю в его браузере
Чуть больше технических деталей
Мы разобрали модель МПК(MVC) функционально, теперь давайте немного углубимся внутрь и посмотрим как все работает на техническом уровне.
Когда вы вводите URL в браузер, чтобы получить доступ к приложению, вы делаете запрос отобразить определенную страницу приложения. Но как приложение узнает, какую именно страницу необходимо показать?
Во время проектирования и написания веб приложений вы определяете маршруты. Маршруты по сути являются URL-шаблонами, которые ассоциируются с определенными страницами. Когда кто-то вводит URL, за кулисами приложение старается найти подходящий шаблон среди предопределенных маршрутов.
Так что по факту у нас есть четыре главных элемента: модель, представление, контроллер и маршрут.
Маршрут
Каждый маршрут связан с контроллером. Если точнее, определенной функцией контроллера, известной как действие контроллера(controller action). Когда вы вводите URL, приложение пытется найти совпадающий маршрут, если совпадение найдено, вызвать соответствующее маршруту действие.
Разберем на примере базового маршрута Flask:
Мы устанавливаем маршрут „/“ с функцией просмотра main_page().
Модели и контроллеры
Под действием контроллера обычно подразумеваются две вещи: модель используется, чтобы достать все необходимые данные из базы данных и данные отправляются в представление, которое рендерит необходимую страницу.
Данные проходящие через модель добавляются к структуре данных (вроде словаря или списка), и именно структура отправляется в представление.
Вернемся к нашему примеру на Flask:
В пределах функции мы цепляем нужные нам данные из базы и выполняем какую-то базовую логику. Например возвращаем список, который мы сохраняем в переменной entries. Этот список будет доступен в шаблоне index.html
Представления
В представлении мы структурируем полученные данные и сохраненную информацию с помощью HTML в конечную страницу, которую пользователь видит в своем браузере.
Опять вернемся к нашему примеру на Flask. Рассмотрим подробнее entries, разобрав её с помощью Jinja:
Итого
Чуть более детализированный алгоритм процесса запроса МПК(MVC):
- пользователь запрашивает представление страницу, введя URL
- приложение находит подходящий предопределенный маршрут
- вызывается действие контроллера подходящее под найденный маршрут
- действие контроллера использует модели, чтобы доставить все необходимые данные из базы данных, собирает их в массив и загружает в представление, структурируя данные.
- представление использует структурированные данные, чтобы отрендерить необходимую страницу, которая будет показана пользователю в его браузере.
__________________________________________________________________________________________
Спасибо всем, кто дочитал. В следующих статьях запланирован перевод туториала по Django и небольшой отчет по прошествии 10 месяцев обучения программированию. Ну а пока, вторя мантре ютуберов и прочих жителей соцсетей: подписывайтесь, ставьте лайк, оставайтесь на связи)