1. Фреймворк Django.
Авторы: веб-разработчики Адриан Головати и Саймон Уиллисон (США). Первый публичный релиз в 2008г. Название: в честь французского гитариста-виртуоза Джанго Рейнхардта.
Фреймворк (с англ. framework — «каркас, структура») - программное обеспечение (платформа), облегчающее разработку и объединение компонентов большого программного проекта. Фреймворк Django - программное обеспечение для веб-приложений на языке Python.
2. Зачем нужны фреймворки.
Фреймворк— заготовка, готовая модель для быстрой разработки проектов. Задает структуру, правила и предоставляет набор инструментов для создания проекта. В основном используется в веб-разработке сайтов и интернет магазинов. Позволяет правильно выстроить бизнес-логику.
Особенности Django:
Востребованность. Работает в большинстве компаний: Instagram, Disqus, Mozilla, The Washington Times, Pinterest, National Geographic, Яндекс.Практикум.
Популярность в сообществе свободного программного обеспечения. Фреймворк стал стремительно развиваться усилиями волонтёров. В настоящее время сообщество Django включает тысячи разработчиков из многих стран мира.
Расширяемость. Дорабатывается и расширяется с помощью библиотек и плагинов (модулей, позволяющих быстро добавить на сайт нужную функцию).
Административная панель Django. Автоматически генерируется при создании приложения. Это избавляет разработчика от необходимости создавать «админку» вручную.
Взаимодействие с базами данных. Осуществляется через инструмент Django ORM, благодаря которому все запросы к базе данных SQL пишутся прямо на Python.
3. Как устроены проекты? Проекты состоят из приложений.
Проект – это уникальная деятельность, имеющая начало и конец во времени, направленная на достижение определённого результата. Приложения — максимально независимые части проекта. Каждое приложение в проекте отвечает за решение одной определённой задачи. Фрэймворки - являются комплексными платформами для разработки программ. Комплексность фрэймворков заключается в том что, они содержат в себе всё необходимое для создания полноценной программы. Для Django характерно разработка не только новых приложений, но и повторное их использование в разных проектах со сходными задачами.
4. Запуск проекта в тренажёре. Settings.
Онлайн-тренажер Django - программное средство обучения. Код в Django запускается только на сервере. Загрузка и запуск кода на сервере называется deploy.
После запуска проекта в тренажёре появится сформированный Django веб-адрес {URL}, по которому запущенный проект будет доступен в интернете. Этот адрес не постоянный в процессе разработки он может изменяться от задачи к задаче. В теории и заданиях он обозначается символами {URL} - Uniform Resource Locator (Единый указатель ресурса).
Отображение стандартной страницы Django в браузере пользователя по скопированному адресу {URL} из тренажёра:
Файловая структура. В этой области тренажёра добавляются папки и файлы проекта.
anfisa4friends – произвольное название папки Django-проекта в тренажере.
manage.py – корневой файл для установки дополнительных библиотек, создание приложений, регистрации пользователей из командной строки. В тренажёре не используется.
urls.py – файл для хранения списка всех доступных веб-адресов (URL) проекта.
settings.py (или конфиг)– файл для настройки прав доступа, подключение библиотек, языка сайта, регистрации приложений и других глобальных настроек проекта.
Редактор кода файлов. В этой области пишется код файлов и редактируются настройки проекта.
Языковые настройки выполняются в setting. ру (конфиге).
Setting.ру → LANGUAGE_CODE = ‘en’ - английский язык:
Setting.ру → LANGUAGE_CODE = ‘ru’ - русский язык:
Терминал - окно для вывода служебной информации и сообщений об ошибках запущенного проекта.
5. Проект Anfisa4friends. Наполнение проекта.
Стандартный исходный проект в тренажере Django назван Anfisa4friends - это пустая заготовка. Для его наполнения необходимо сначала зарегистрировать (или подключить) приложение, т.е. просто добавить его название в файл конфиг: setting.ру → INSTALLED_APPS→ "homepage":
После регистрации первого приложения в тренажере создаётся новая папка homepage и файл views.ру с кодом, содержащим текст приветствия: return HttpResponse('Anfisa for Friends -- Hello, world! -- ¯\(°:°)/¯'):
Отображение главной страницы в браузере под управлением зарегистрированного приложения homepage, а не под управлением стандартного кода Django:
6. URLs и VIEWs. Относительные URLs. Шаблоны URLs.
URLs - Uniform Resource Locators (от англ. «единые указатели ресурса» или «единообразные определители местонахождения ресурса» или веб-адреса интернет ресурса). Каждый ресурс (сайт и страница) имеют в интернете свой уникальный URL или веб-адрес:
Веб-адреса всех страниц начинаются с названия протокола http (или https) и имени домена (домен, главная страница, головной домен, главный домен - это одно и тоже далее в тексте):
Абсолютные URL - полные адреса с указанием протокола и домена. Относительные URL - адреса без указания протокола и домена:
Относительные адреса удобны тем, что проект можно разместить на любом домене, не изменяя код, поскольку имя домена в коде не упоминается. А если надо указать, то за адрес домена принимаются пустые кавычки «''» . Например в коде: path('', home_views.index) пустые кавычки это путь к главной странице.
Местом хранения относительных URLs является список urlpatterns в файле urls.py. В этот список включается также имя функции отображения содержимого по адресу URL. Такая пара «адрес – функция отображения» называется шаблоном (образцом) веб-адреса. Например: path('', home_views.index) - это элемент списка «urlpatterns» с шаблоном: имя главной страницы «''» и имя функции «home_views.index». Другими словами строка path('', home_views.index) – это маршрут к шаблону отображения главной страницы. Перечисление пар «адрес – функция» - это и есть список urlpatterns (от англ. patterns-шаблоны). Этот список создаётся переменной urlpatterns и функцией path. Пример такого списка:
Формирование списка urlpatterns выполняется импортом функции path из каталога django.urls и файла views.ру из приложения проекта.
urlpatterns пустого проекта Anfisa4friends:
urlpatterns после регистрации первого приложения homepage:
VIEWs - это view-функции, которые обрабатывают запрос и находятся в файлах views.ру. Они получают на вход данные из запроса (объект request), а возвращают ответ (объект HttpResponse). Такие функции называют view-функциями или функциями представления (англ. view — «вид, отображение, представление») В российском Django-сообществе распространён перевод «представление».
При открытии ссылки {URL} в браузере пользователя (клиента), возникший запрос HTTP Request будет получен и проверен сервером по запрошенному URL в файле urls.py, где строка path('', home_views.index) вызовет функцию def index(request) в файле views.ру , соответствующую адресу главной страницы(''). Функция def index(request) обработает запрос и вернёт ответ пользователю: HttpResponse('Anfisa for Friends -- Hello, world! -- ¯\(°:°)/ :
Для дальнейшей работы с проектом осталось поменять приветствие главной страницы на русский язык в объекте ответа HttpResponse:
Рис.2
Представление главной страницы с русским текстом приветствия в браузере пользователя
7. Больше адресов! Команда Include
Для удобства разработки проектов все доступные адреса URLs разбиты по своим приложениям и там находятся. А в головном URLs (anfisa4friends/urls.py) хранятся только указания на имена приложений со своими списками адресов. Задачей команды include и является указать на имена этих приложений, т.е. включить файлы адресов urls.py приложений в головной urls.py. Эта команда определяет так называемые вложенные маршруты для использования одних urlpatterns в других.
Для каждого приложения создается свой файл urls.ру:
Команда include включает urls.py приложения в головной urls.py:
Логика обработки запроса после команды include:
8. Время icecream. Импорт. Первое испытание.
Подготовка еще одного приложения icecream и страницы в нём, в которой будет отображаться информация о различных сортах мороженого, а представление этой информации станет выполнять view - функция страницы icecream:
1)Регистрация в проекте приложения icecream:
2)Создание вложенного маршрута в головном urlpatterns к адресам приложения icecream:
3)Создание urlpatterns приложения icecream:
Рис.3
4)Создание view-функции def icecream_list (request), возвращающую фразу 'Здесь будет список сортов мороженого ':
5)Результат работы приложения icecream, который пока можно увидеть дописыванием /icecream/ к скопированному {URL} в браузере:
Инструкция для импорта файлов и их объектов записывается в формате: from .<адрес папки/файла.ру > import <файл.ру/объект в файле.ру>, где символ точка «.» сразу после from означает текущую директорию, в которой выполняется импорт.
Импорт из каталога Django в исполняемый код работает по такому же принципу как импорт из библиотек Python:
Для обещанного выше списка сортов мороженого в приложении icecream создается файл models.ру, который содержит icecream_db - это «почти база данных» или список сортов мороженого:
Путь к базе: icecream → models.ру → icecream_db. Почему «почти база данных», потому что это простейшая база данных, состоящая из списка словарей, где признаком списка является квадратные скобки [ ], а признаком словаря фигурные скобки { }:
Код «почти база данных» с правилами оформления кода представляет понятный хорошо читаемый текст:
Код файла views.ру для отображения «почти базы данных» или списка сортов мороженого:
Результат работы кода файла icecream/views.ру по выводу списка мороженого в браузере:
Информацию по частям из вышеприведённого списка получают с помощью индекса, а из словаря с помощью ключа в def icecream_list():
1) Код для вывода первого элемента списка по индексу [0]:
Результат вывода частичной информации по индексу [0] для первого элемента списка мороженого:
2) Код для вывода по ключу словаря "description" второго элемента списка мороженного с описанием сорта, но без его названия:
Результат вывода по ключу словаря "description" второго элемента списка с описанием мороженного без его названия:
3) Код для вывода только названий мороженого по ключам словаря "name":
Рис.7
Результат вывода только названий мороженого:
При открытии страницы мороженого view-функция def icecream_list(request) получает данные из файла models.ру и отправляет их клиенту:
10. Основы HTML. Теги и HTML-файлы.
При запросе к определённому URL, сервер возвращает пользователю форматированную текстовую строку. Форматирование текста заключается в изменении его вешнего вида для удобства чтения. Выполняется с помощью структурирования — это разбиение текста на отдельные значащие фрагменты (абзацы, заголовки, списки и цитаты). Структурирование текста реализуется программным языком HTML - Hyper Text Markup Language (англ. «язык разметки гипертекста»). Разметка информации на странице выполняется тегами, которые обозначаются треугольными скобками, внутри которых указывается название тега и необязательные атрибуты: < имя_тега [атрибуты]>. Парные теги оборачивают информацию, а одиночные нет:
<имяТега>Оборачиваемое содержимое</имяТега> - это парный тег
<имяТега> - это одиночный тег.
Примеры используемых тегов:
Подготовка двух HTML-файлов для главной страницы и для страницы с мороженым:
Файл главной страницы сайта традиционно называют index. Для него подготовлен HTML-файл index.html, который заполнен информацией с тегом заголовка проекта, картинкой и ссылкой к списку мороженного:
Рис.9
Для страницы мороженого подготовлен HTML-файл icecream-list.html, в котором два заголовка, статичный список мороженого и ссылка на главную страницу:
Рис.10
11. Templates. Подключение шаблонов. HTML-шаблоны
Для удобства разработки проектов HTML-код хранится не в view-функциях, а отдельно в HTML-файлах (шаблонах). Для HTML-шаблонов создается корневая папка Templates, в которой находятся папки с названиями приложений проекта и относящиеся к этим папкам HTML-файлы. Эти файлы, подготовленные в предыдущем разделе теперь будут называться HTML-шаблонами. Файловая структура на этом этапе имеет следующий вид:
В HTML-шаблонах папки Templates собираются данные, подготовленные view-функциями. После «сборки» в шаблоне готовые страницы отправляется клиенту:
Django Templates - инструмент для работы с шаблонами. Он подключен в константе TEMPLATES файла setting.ру:
12. Передаем информацию в шаблон. Функция render() и словарь context{}
Для передачи информации в шаблон view-функции Django используют функцию render() и словарь context{}. Функция render() (англ. визуализация), возвращает объект HttpResponse, который содержит код HTML-страницы, собранной из HTML-кода шаблона и данных, переданных в него из view-функции. Словарь context (англ. «смысл») - так называют обычный словарь dict{} с данными, которые надо поместить в шаблон.
В функции render() обязательны только два аргумента: request и адрес HTML-шаблона. Словарь с данными context можно и не передавать, код отработает и без словаря.
В этом разделе необходимо отредактировать две предыдущие view-функции и два подготовленных ранее шаблона с учетом render() и context:
1) В файле homepage/views.ру(Рис.2) надо импортировать функцию render и использовать её вместо HttpResponse. Функция render() нужна для создания возвращаемой страницы, в которой собраны воедино данные и HTML-шаблон. В render() словарь context не передаётся, поскольку его пока нет:
Рис.13
2) В файле index.html(Рис.9) надо изменить адрес ссылки в шаблоне index.html на "/icecream/", т.к. список мороженного теперь находится именно по этому адресу (вместо ссылки на артефакт icecream-list.html ):
Рис.14
3) В файле icecream/views.ру (Рис.7) с только названиями мороженного надо вывести названия построчно без разделителя :: и добавить тег <br> (перенос строки), а также создать словарь context и использовать render():
Рис.15
4) В файле icecream-list.html(Рис.10) надо заменить адрес ссылки с "index.html" на главную страницу "/", далее удалить статичный список мороженого и вывести список мороженного уже из словаря context рисунка 15:
Результатом передачи информации в шаблон является отображение всего списка названий мороженого из «почти базы данных» и связь двух страниц между собой через ссылки <a href="Веб-адрес"></a>.
13. Отдельная страница для сорта мороженого. Выражение <int:pk>
Для представления отдельной страницы сорта мороженого добавляется ещё один новый HTML-шаблон icecream-detail.html в папку Templates и используется переменная в веб-адресе шаблона urlpatterns приложения icecream:
Выражение <int:pk> устанавливает переменную в адресе urlpatterns, где pk ( primary key, «первичный ключ») - общепринятое имя для переменных, в которых передаётся индекс объекта. В нашем случае это индекс из списка мороженного и он уникальным образом определяет каждый словарь в базе данных icecream_db. А запись с int: <int:pk> означает, что Django ожидает целочисленное значение и преобразует его в переменную pk. Тогда строка в urlpatterns : path('<int:pk>/', views.icecream_detail) указывает на то, что переменная pk передается во view-функцию и данные будут сформированы на ее основе. При таком подходе можно обойтись одним path(), одной view-функцией и одним HTML-шаблоном для всех словарей нашей «почти базы данных». С учетом вышеизложенного редактируются urlpatterns, view-функция и HTML-шаблон в приложении icecream:
1) В файле icecream/urls.ру(Рис.3) в списке urlpatterns добавляется шаблон с переменной pk в адресе:
Рис.17
2) В файле icecream/views.ру(Рис.15) добавляется вторая view-функция def icecream_detail(request, pk) с переменной pk:
Рис.18
3) Создаётся новый HTML-шаблон icecream-detail.html для вывода отдельной страницы сорта мороженного из словаря context функции def icecream_detail(request, pk) рисунка 18:
Рис.19
4) В файле icecream/views.py(Рис.18) необходима навигация по сортам мороженого, что означает превращение каждого названия мороженого в ссылку, при клике на которую можно было перейти на страницу с подробной информацией об этом мороженом. Реализуется всё это парным тегом внутри которого находится относительная ссылка на каждое название мороженного в строке функции def icecream_list(request):
В итоге: представление главной страницы, страницы списка мороженого и отдельной страницы для сорта мороженого выполняется соответственно следующими view-функциями: def index(request), def icecream_list(request) и def icecream_detail(request ). HTML-шаблоны для этих view-функций: index.html, icecream-list.html и icecream-detail.html. View-функции двух страниц мороженого расположены в файле icecream/views.ру. В проекте работают два приложения и три страницы. Представление всех страниц и связи между ними на этом этапе разработки проекта:
14. Совместная работа приложений.
Совместная работа - это когда список мороженного из одного приложения icecream, а список друзей из другого нового приложения anfisa и все это на одной странице /homepage/, которой будет управляет третье приложение homepage. С учетом изменившихся правил работы проекта, добавляется новое приложение anfisa, редактируются предыдущие view-функции и удаляются ненужные элементы кода:
1) Регистрация нового приложение anfisa со списком друзей (models.ру), которое включается в файловую структуру проекта:
2) Вывод на главную страницу списка названий мороженого. В файле homepage/views.ru(Рис.13) импортируется словарь icecream_db из icecream/models.ру, а view-функция index(request) главной страницы настраивается так, чтобы она вывела список названий мороженого и ссылку «Узнать состав» рядом с каждым названием. Теперь в render() для главной страницы располагается и список мороженного в context, а не только один шаблон index.html как раньше:
Рис.20
3) Вывод на главную страницу списка имен друзей. В файле homepage/views.ru(Рис.20) импортируется словарь друзей friends_db из приложения anfisa. В функцию def index(request) добавляется ещё один цикл по перебору словаря friends_db и создается переменная friends, в которой будут храниться имена друзей, разделённые HTML-тегом <br>. В render() список друзей выводится из context в шаблон главной страницы index.html:
Рис.21
4) После переноса списка сортов мороженого на главную страницу /homepage/, страница /icecream/ потеряла свою актуальность. Пришло время удалить из кода все упоминания о странице /icecream/ в Рис.17, Рис.18, Рис.19 :
Рис.22
Рис.23
Рис.24
5) Удаление артефакта icecream-list.html из файловой структуры:
Результат совместной работы приложений - это вывод на одну главную страницу и списка названий мороженого и списка имён друзей. На этом этапе разработки проекта работают три приложения и две страницы. Представление главной страницы и отдельной страницы сорта мороженого выполняется соответственно view-функциями: def index() и def icecream_detail( ). HTML-шаблоны этих функций: index.html и icecream-detail.html. В файле icecream/views.ру располагается одна view-функция def icecream_detail( ). Код HTML-шаблона для главной страницы с выводом списков мороженого и друзей:
15. Релиз: Бизнес-логика.
Постановка задачи: получить название города по имени друга и определить погоду в городе, где он проживает.
1) Для решения этой задачи в приложении anfisa создается файл services.py (сервис) с готовой служебной функцией what_weather(), которая определяет погоду:
2) Редактируется файл homepage/views.py(Рис.21) с учётом определения погоды в городе друга (импортируется функция погоды → определяется город друга → город передаётся в функцию погоды → функция погоды выдаёт сведения о погоде → в переменной friends собираются друг, город и погода в одной строке → эта строка через context передаётся в шаблон index.html):
Рис.25
16. POST-запросы. Веб-форма <form>, элемент <input> и кнопки.
Постановка задачи: дать возможность пользователю отправить на сервер информацию о том, какого друга и каким мороженым он хочет его угостить. Для её решения в проекте применяются POST-запросы (post (англ.) -посылать), которые анализируются в кодах view-функции и в HTML-шаблонах приложения homepage. Там же размещаются и коды кнопок формирования такого типа запроса.
POST-запросы отправляются для изменения или сохранения данных на сервере. GET-запросы (get (англ.- получать) отправляются только для получения страницы или информации от сервера. POST-запросы используются при регистрации на каком-либо сайте, при создании и редактировании сообщений в соцсетях, при покупках в интернете и т.д. Для отправки данных через POST-запросы используются веб-форма <form> и элемент веб-формы <input> с элементами интерфейса:
<form атрибуты> ... </form> - это Веб-форма (<form>), обозначается парным тегом формы. Дает пользователю возможность отправлять на сервер данные прямо с веб-страницы.
<input атрибуты> - это элемент формы (<input>), обозначается одиночным тегом. Предназначен для создания элементов интерфейса: текстовых полей, различных кнопок, переключателей и флажков. Элемент <input> не требуется помещать внутрь контейнера <form>, но если введенные пользователем данные должны быть отправлены на сервер, то присутствие <form> обязательно. Элемент интерфейса radio button или радиокнопка, используется как переключатель при выборе одного единственного варианта из нескольких предложенных. Тег радиокнопки: <input type="radio" name="имя" атрибуты>. Элемент интерфейса submit кнопка (англ."submit"‒отправить) используется для отправки веб-формы. Тег кнопки submit: <input type="submit" value="надпись на кнопке">
Код кнопки submit находится в HTML-шаблоне файла homepage/index.html, а коды радиокнопок расположены во view-функции def index(request) файла homepage/views.ру нашего проекта:
Финальный код HTML-шаблона главной страницы c веб-формой <form>, с Post-запросом к главной странице "/" и submit-кнопкой:
Рис. 26
POST-запрос указывается как в веб-форме HTML-шаблона так и в view-функции index(request) главной страницы:
Представление главной страницы с учётом Post-запросов и кнопок:
Постановка задачи: дать возможность Анфисе давать рекомендации пользователю лакомиться мороженым или нет в зависимости от погоды.
Парсинг (от англ. parse) это поиск данных → извлечение данных → сохранение данных. Распарсить - извлечь нужную информацию из строки str. Выполняется в def what_temperature(weather), где извлекается числовое значение температуры в строке weather, полученной из функции погоды. Пример извлечения -12 для значения weather = '☀️ 🌡️-12°C 🌬️→6.1m/s':
Схема кода для получения числового значения температуры (parsed_temperature) на главной странице:
Представление главной страницы с числовым значением температуры:
Создание def what_conclusion(parsed_temperature). Эта функция рекомендации другу находится в сервисе папки anfisa:
Окончательная схема кодов для представления главной страницы с фразой рекомендацией другу, выбранным именем друга, названием города друга, погодой в этом городе и сортом выбранного мороженого:
Финальное представление главной страницы проекта Anfisa4friends в браузере с рекомендацией и другими сообщениями для пользователя:
К конспекту Python →