В предыдущем уроке мы дошли до следующей структуры:
# Получаем объекты из базы
photos = Photo.objects.all()
# Передаем их в шаблон
render(request, 'polls/detail.html', {'photos': photos})
В этом случае:
- Модель предметной области описана с помощью ORM (в других случаях это не обязательно, ведь хранилище отделено от модели)
- Функция-обработчик обращается к модели для выполнения запрошенных операций и выводит необходимые данные в шаблон
- Шаблон описывает представление конкретной страницы и строится на данных, переданных из функции-обработчика
Описанная структура называется Model-View-Controller (MVC version 2). Эта структура устроена так:
- M — модель предметной области
- V — шаблон
- C — наша функция-обработчик (в других фреймворках могут быть другие сущности)
MVC разделяет приложение минимум на три слоя и определяет, как слои могут взаимодействовать друг с другом. Это важно для создания модульных приложений — таких, которые легко развивать и модифицировать. При этом никто не запрещает добавлять новые и дробить текущие слои, все это уже зависит от сложности самого приложения.
MVC может быть устроена так:
Рассмотрим схему подробнее:
- M — ядро приложения, его бизнес-логика. M не знает ничего о других частях приложения и не может на них влиять
- V — получает данные от C и иногда от M, но такое не приветствуется. И уж точно V не должен знать ничего о базе данных. Кстати, этим грешат начинающие разработчики, которые выполняют SQL-запросы прямо из шаблонов
- C — использует M для выполнения запрашиваемых операций и отвечает за генерацию V
MVC является архитектурным шаблоном или паттерном проектирования — это такая повторяемая архитектурная конструкция, которая решает проблему проектирования в рамках некоторого распространенного контекста. В нашем случае контекст — обработка HTTP-запросов.
Паттернов проектирования очень много на все случаи жизни. Некоторые из них очень простые и ближе к идиомам — каким-то локальным участкам кода, которые принято писать тем или иным способом в конкретном языке.
Некоторые паттерны — всеобъемлющие, подобные MVC. Они определяют глобальные ограничения, но ничего не говорят о способе реализации. В любом случае паттерны — не догма и не формальная спецификация. Всегда есть место для самостоятельного выбора.
В MVC заложена довольно простая, но важная идея — разделение приложения на слои с четкими границами. Такой подход позволяет развивать каждый слой независимо от других, если у вас правильно выстроены зависимости между ними.
Обратите внимание, что в MVC все связи однонаправленные. Другими словами, в MVC нет двух слоев, которые знают друг о друге одновременно. Если один слой знает о другом, то второй ничего не знает о первом, и наоборот. Модульность — это один из ключевых факторов, делающих приложения по-настоящему качественными с точки зрения разработки. Как вы увидите позже, многие веб-фреймворки построены именно по модели MVC с небольшими модификациями, не влияющими на ключевую идею.
Дополнительные материалы
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.