Модель MTV. Добавление первого приложения

Курс по Django: https://stepik.org/a/183363

Смотреть материал на YouTube | RuTube

Архив проекта: 03_sitewomen.zip

На этом занятии подробнее разберемся как в Django работает механизм обработки запросов от пользователя. Это понимание пригодится в дальнейшем, описывая отдельные элементы процедуры запроса-ответа.

Смотрите, вначале, когда запрос приходит на фреймворк, он пропускается через блок маршрутизации:

Здесь фиксируется тип URL-адреса и в списке шаблонов предопределенных адресов ищется первое совпадение. Например, пользователь вводит запрос:

http://127.0.0.1:8000/

Это есть не что иное, как главная страница сайта, фактически пустой запрос без параметров. Следующий запрос:

http://127.0.0.1:8000/category/1/

соответствует шаблону:

category/<число>

Это уже другой маршрут. Или такой запрос:

http://127.0.0.1:8000/women/madonna/

с шаблоном:

women/<слаг (строка)>

И так далее. У нас может быть прописано множество типов URL-адресов и каждый шаблон связан со своим обработчиком – представлением (иногда его еще называют контроллером). Если текущий запрос от пользователя не совпал ни с одним предопределенным URL, то возвращается код ошибки 404 – страница не найдена.

Предположим, что маршрутизатор нашел совпадение. Далее, активизируется представление, связанное с найденным типом URL-адреса. Представление – это или функция или класс, который отвечает за формирование ответа на соответствующий запрос. Как правило, ответом является HTML-страница. Эта страница, затем, возвращается клиенту, и он ее видит в браузере. Так вот, чтобы представление могло сформировать страницу, в общем случае, требуются данные (информация), плюс  шаблоны, в которые эти данные упаковываются. Например, приходит запрос на вывод страницы о Мадонне:

http://127.0.0.1:8000/women/madonna/

срабатывает соответствующее представление, которое берет шаблон информационной страницы и наполняет ее данными об этой певице, хранящиеся в БД:

На выходе получаем сформированную HTML-страницу, которая и возвращается пользователю. Вот такое разделение на данные (model), шаблоны (templates) и представления (views) представляет собой общеизвестный паттерн MTV, то есть, разделение данных и HTML-шаблонов. Техника довольно эффективна и удобна, так как позволяет независимо наполнять БД информацией и параллельно разрабатывать или изменять функционал сайта. Кроме того здесь легче находить ошибки, в отличие от подхода, когда в одном скрипте присутствует и подключение к БД и оперирование шаблонами. Методика «разделяй и властвуй» очень хорошо себя зарекомендовала в мире программирования и довольно часто используется в том или ином виде.

Добавление первого приложения

Отлично, я думаю общие принципы работы фреймворка Django вам понятны. Какой должен быть наш следующий шаг? Согласно философии Django мы должны создать новое приложение в рамках нашего сайта. Что это за приложение и зачем оно вообще нужно? Разработчики фреймворка решили, что каждая самостоятельная часть сайта должна представляться в виде своего отдельного приложения. Например, создавая информационный сайт, мы должны будем определить приложение для отображения страниц этого сайта по определенным запросам. Далее, к нам приходит руководитель проекта и сообщает, что еще нужно реализовать форум на сайте. И, так как это функционально независимая часть сайта, то мы создаем еще одно приложение для форума. Затем, руководитель почесал свою репу и вспомнил, что еще нужно сделать раздел с опросом пользователей по разным тематикам. И на сайте появляется еще одно приложение – для опроса. И так далее. Каждая логически и функционально независимая часть сайта предполагает его реализацию в виде отдельного приложения:

Приложения в Django следует реализовывать максимально независимыми, в идеале – полностью независимыми, чтобы в дальнейшем мы могли их просто скопировать в другой сайт и там оно сразу же начинало бы работать. Это не всегда удается, но к этому нужно стремиться.

Итак, давайте создадим в нашем сайте первое приложение, которое возьмет на себя базовый функционал, то есть, оно и будет являться ядром нашего сайта. Для этого я открою терминал и, находясь в каталоге django/sitewomen, выполню команду:

python manage.py startapp women

Здесь startapp – команда для создания нового приложения; women – название приложения. Название может быть любым (мы его придумываем сами), но так, чтобы оно отражало суть своего функционала. В данном случае приложение women (женщины) будет формировать станицы сайта об известных женщинах из разных областей жизни: кино, спорт, музыка, политика.

После выполнения команды у нас в проекте появилась еще одна папка – women, которая уже содержит несколько файлов, в том числе, и файл __init__.py. Следовательно, приложение в Django реализуется как пакет языка Python. Также здесь присутствует одна вложенная папка migrations для хранения миграций БД нашего приложения. Подробнее о ней мы поговорим позже. Остальные файлы имеют следующее назначение:

  • admin.py – для настройки админ-панели сайта (админ-панель поставляется совместно с Django и каждый сайт может сразу ее использовать);
  • apps.py – для настройки (конфигурирования) текущего приложения;
  • models.py – для хранения ORM-моделей для представления данных из базы данных;
  • tests.py – модуль с тестирующими процедурами;
  • views.py – для хранения представлений (контроллеров) текущего приложения.

После создания приложения его необходимо зарегистрировать в проекте нашего сайта, чтобы фреймворк Django «знал» о его существовании и корректно с ним работал. Для этого нужно перейти в пакет конфигурации сайта (sitewomen), открыть файл settings.py и в списке INSTALLED_APPS прописать новое приложение. В нем уже прописаны несколько стандартных приложений самого фреймворка и к ним мы просто добавим свое:

INSTALLED_APPS = [
...
    'women',
]

По идее этого вполне достаточно и все будет работать, но в действительности Django обращаясь к этому пакету находит файл apps.py, откуда и берет настройки приложения из класса WomenConfig. Чтобы в дальнейшем каждый раз не конкретизировать этот путь, я пропишу его сразу в списке приложений:

INSTALLED_APPS = [
...
    'women.apps.WomenConfig',
]

Все, первое (основное) приложение сайта создано. На следующем занятии мы пропишем в нем свои собственные URL-маршруты и простые представления для реализации полноценного механизма запроса-ответа.

Курс по Django: https://stepik.org/a/183363

Видео по теме