The words you are searching are inside this book. To get more targeted content, please make full-text search by clicking here.

Книга посвящена разработке веб-сайтов на языке Python с применением веб-фреймворка Django. Представлены новинки Django 4 и дано наиболее полное описание его инструментов: моделей, контролеров, шаблонов, средств обработки пользовательского ввода, включая выгруженные файлы, разграничения доступа, посредников, сигналов, инструментов для отправки электронной почты, кэширования и пр. Рассмотрены дополнительные библиотеки, производящие обработку BBCode, CAPTCHA, вывод графических миниатюр, аутентификацию через социальные сети (в частности, "ВКонтакте"), интеграцию с Bootstrap. Рассказано о программировании веб-служб REST, использовании и настройке административного веб-сайта Django, публикации сайтов с помощью веб-сервера Uvicorn, работе с базами данных PostgreSQL, локализации строк, форматов и временных зон. Подробно описано создание полнофункционального веб-сайта — электронной доски объявлений.

Discover the best professional documents and content resources in AnyFlip Document Base.
Search
Published by BHV.RU Publishing House, 2023-04-08 02:08:49

Django 4. Практика создания веб-сайтов на Python

Книга посвящена разработке веб-сайтов на языке Python с применением веб-фреймворка Django. Представлены новинки Django 4 и дано наиболее полное описание его инструментов: моделей, контролеров, шаблонов, средств обработки пользовательского ввода, включая выгруженные файлы, разграничения доступа, посредников, сигналов, инструментов для отправки электронной почты, кэширования и пр. Рассмотрены дополнительные библиотеки, производящие обработку BBCode, CAPTCHA, вывод графических миниатюр, аутентификацию через социальные сети (в частности, "ВКонтакте"), интеграцию с Bootstrap. Рассказано о программировании веб-служб REST, использовании и настройке административного веб-сайта Django, публикации сайтов с помощью веб-сервера Uvicorn, работе с базами данных PostgreSQL, локализации строк, форматов и временных зон. Подробно описано создание полнофункционального веб-сайта — электронной доски объявлений.

Keywords: Django

Владимир Дронов Санкт-Петербург «БХВ-Петербург» 2023


УДК 004.738.5+004.438Python ББК 32.973.26-018.1 Д75 Дронов В. А. Д75 Django 4. Практика создания веб-сайтов на Python. — СПб.: БХВ-Петербург, 2023. — 800 с.: ил. — (Профессиональное программирование) ISBN 978-5-9775-1774-4 Книга посвящена разработке веб-сайтов на языке Python с применением вебфреймворка Django. Представлены новинки Django 4 и дано наиболее полное описание его инструментов: моделей, контроллеров, шаблонов, средств обработки пользовательского ввода, включая выгруженные файлы, разграничения доступа, посредников, сигналов, инструментов для отправки электронной почты, кеширования и пр. Рассмотрены дополнительные библиотеки, производящие обработку BBCode, CAPTCHA, вывод графических миниатюр, аутентификацию через социальные сети (в частности, «ВКонтакте»), интеграцию с Bootstrap. Рассказано о программировании веб-служб REST, использовании и настройке административного веб-сайта Django, публикации сайтов с помощью веб-сервера Uvicorn, работе с базами данных PostgreSQL, локализации строк, форматов и временных зон. Подробно описано создание полнофункционального веб-сайта — электронной доски объявлений. Электронное приложение-архив на сайте издательства содержит коды всех примеров. Для веб-программистов УДК 004.738.5+004.438Python ББК 32.973.26-018.1 Группа подготовки издания: Руководитель проекта Евгений Рыбаков Зав. редакцией Людмила Гауль Редактор Григорий Добин Компьютерная верстка Ольги Сергиенко Дизайн серии Марины Дамбиевой Оформление обложки Зои Канторович Подписано в печать 05.04.23. Формат 70×1001 /16. Печать офсетная. Усл. печ. л. 64,5. Тираж 1000 экз. Заказ № "БХВ-Петербург", 191036, Санкт-Петербург, Гончарная ул., 20. Отпечатано в АО "Первая Образцовая типография" Филиал "Чеховский Печатный Двор" 142300, Московская область, г. Чехов, ул. Полиграфистов, д. 1 Сайт: www.chpd.ru, E-mail: [email protected], тел. 8(499)270-73-59 ISBN 978-5-9775-1774-4 © ООО "БХВ", 2023 © Оформление. ООО "БХВ-Петербург", 2023


Оглавление Предисловие ................................................................................................................... 19 Что такое веб-фреймворк? ............................................................................................................ 19 Почему Django? ............................................................................................................................. 20 Что нового в Django 4.1 и новой книге? ...................................................................................... 21 Использованные программные продукты ................................................................................... 21 Типографские соглашения ............................................................................................................ 22 ЧАСТЬ I. ВВОДНЫЙ КУРС ....................................................................................... 25 Глава 1. Основные понятия Django. Вывод данных .............................................. 27 1.1. Установка фреймворка ........................................................................................................... 27 1.2. Проект Django ......................................................................................................................... 28 1.3. Отладочный веб-сервер Django ............................................................................................. 29 1.4. Приложения............................................................................................................................. 30 1.5. Контроллеры ........................................................................................................................... 32 1.6. Маршруты и маршрутизатор ................................................................................................. 33 1.7. Модели ..................................................................................................................................... 36 1.8. Миграции ................................................................................................................................. 38 1.9. Консоль Django ....................................................................................................................... 40 1.10. Работа с моделями ................................................................................................................ 40 1.11. Шаблоны ............................................................................................................................... 44 1.12. Контекст шаблона, рендеринг и сокращения ..................................................................... 46 1.13. Административный веб-сайт Django ................................................................................... 47 1.14. Параметры полей и моделей ................................................................................................ 52 1.15. Редактор модели ................................................................................................................... 53 Глава 2. Связи. Ввод данных. Статические файлы ............................................... 56 2.1. Связи между моделями .......................................................................................................... 56 2.2. Строковое представление модели ......................................................................................... 58 2.3. URL-параметры и параметризованные запросы .................................................................. 59 2.4. Обратное разрешение интернет-адресов .............................................................................. 63 2.5. Формы, связанные с моделями .............................................................................................. 65 2.6. Контроллеры-классы .............................................................................................................. 65


4 Оглавление 2.7. Наследование шаблонов......................................................................................................... 68 2.8. Статические файлы ................................................................................................................. 71 ЧАСТЬ II. БАЗОВЫЕ ИНСТРУМЕНТЫ DJANGO ............................................... 75 Глава 3. Создание и настройка проекта ................................................................... 77 3.1. Подготовка к работе ............................................................................................................... 77 3.2. Создание проекта Django ....................................................................................................... 79 3.3. Настройки проекта ................................................................................................................. 79 3.3.1. Основные настройки ........................................................................................................ 79 3.3.2. Параметры баз данных ..................................................................................................... 80 3.3.3. Список зарегистрированных приложений ...................................................................... 83 3.3.4. Список зарегистрированных посредников ..................................................................... 84 3.3.5. Языковые настройки ........................................................................................................ 85 3.3.6. Доступ к настройкам проекта из программного кода ................................................... 88 3.3.7. Создание собственных настроек проекта ....................................................................... 88 3.4. Создание, настройка и регистрация приложений ................................................................ 89 3.4.1. Создание приложений ...................................................................................................... 89 3.4.2. Настройки приложений .................................................................................................... 89 3.4.3. Регистрация приложений в проекте ................................................................................ 90 3.5. Средства отладки .................................................................................................................... 91 3.5.1. Отладочный веб-сервер Django ....................................................................................... 91 3.5.2. Веб-страница сообщения об ошибке .............................................................................. 92 3.6. Работа с несколькими базами данных .................................................................................. 94 3.6.1. Регистрация используемых баз данных .......................................................................... 94 3.6.2. Диспетчеризация данных ................................................................................................. 95 3.6.2.1. Автоматическая диспетчеризация данных .......................................................... 95 3.6.2.2. Указание базы данных в административных командах ..................................... 98 3.6.2.3. Ручная диспетчеризация данных ......................................................................... 99 Глава 4. Модели: базовые инструменты ................................................................ 100 4.1. Объявление моделей ............................................................................................................. 100 4.2. Объявление полей модели ................................................................................................... 101 4.2.1. Параметры, поддерживаемые полями всех типов ....................................................... 101 4.2.2. Классы полей моделей ................................................................................................... 103 4.2.3. Создание полей со списком ........................................................................................... 107 4.3. Создание связей между моделями ....................................................................................... 110 4.3.1. Связь «один-со-многими» .............................................................................................. 110 4.3.2. Связь «один-с-одним» .................................................................................................... 114 4.3.3. Связь «многие-со-многими» .......................................................................................... 115 4.4. Параметры самой модели .................................................................................................... 117 4.4.1. Получение доступа к параметрам модели из программного кода ............................. 124 4.5. Интернет-адрес модели и его формирование ..................................................................... 124 4.6. Методы модели ..................................................................................................................... 125 4.7. Валидация модели. Валидаторы .......................................................................................... 127 4.7.1. Стандартные валидаторы Django .................................................................................. 127 4.7.2. Вывод собственных сообщений об ошибках ............................................................... 131 4.7.3. Написание своих валидаторов ....................................................................................... 133 4.7.4. Валидация модели .......................................................................................................... 134 4.8. Создание моделей на основе существующих баз данных ................................................. 136


Оглавление 5 Глава 5. Миграции ...................................................................................................... 137 5.1. Генерирование миграций ..................................................................................................... 137 5.2. Модули миграций ................................................................................................................. 139 5.3. Выполнение миграций ......................................................................................................... 139 5.4. Вывод списка миграций ....................................................................................................... 141 5.5. Оптимизация миграций ........................................................................................................ 141 5.6. Слияние миграций ................................................................................................................ 142 5.7. Очистка моделей ................................................................................................................... 143 5.8. Отмена миграций .................................................................................................................. 144 Глава 6. Запись данных.............................................................................................. 145 6.1. Правка записей ...................................................................................................................... 145 6.2. Создание записей .................................................................................................................. 146 6.3. Занесение значений в поля разных типов ........................................................................... 147 6.4. Сохранение записей .............................................................................................................. 149 6.4.1. Сохранение копий записей в разных базах данных ..................................................... 150 6.5. Удаление записей.................................................................................................................. 151 6.6. Обработка связанных записей ............................................................................................. 151 6.6.1. Обработка связи «один-со-многими» ............................................................................ 152 6.6.2. Обработка связи «один-с-одним» .................................................................................. 153 6.6.3. Обработка связи «многие-со-многими» ........................................................................ 154 6.7. Произвольное переупорядочивание записей ...................................................................... 156 6.8. Массовые добавление, правка и удаление записей ............................................................ 156 6.9. Выполнение валидации модели ........................................................................................... 159 6.10. Асинхронная запись данных .............................................................................................. 160 Глава 7. Выборка данных .......................................................................................... 161 7.1. Извлечение значений из полей записи ................................................................................ 161 7.1.1. Получение значений из полей разных типов ................................................................ 161 7.2. Доступ к связанным записям ............................................................................................... 162 7.3. Выборка записей ................................................................................................................... 164 7.3.1. Выборка всех записей .................................................................................................... 164 7.3.2. Извлечение одной записи ............................................................................................... 165 7.3.3. Получение числа записей в наборе ............................................................................... 166 7.3.4. Поиск одной записи ........................................................................................................ 167 7.3.5. Фильтрация записей ....................................................................................................... 168 7.3.6. Написание условий фильтрации .................................................................................... 169 7.3.6.1. Написание условий фильтрации по значениям полей связанных записей ........ 172 7.3.6.2. Написание условий фильтрации по значениям полей типа JSON .................. 173 7.3.6.3. Сравнение со значениями других полей. Функциональные выражения ........... 175 7.3.6.4. Сложные условия фильтрации. Выражения сравнения ................................... 176 7.3.7. Выборка уникальных записей ....................................................................................... 177 7.3.8. Выборка указанного числа записей .............................................................................. 178 7.3.9. Экономная выборка записей .......................................................................................... 178 7.4. Сортировка записей .............................................................................................................. 179 7.5. Агрегатные вычисления ....................................................................................................... 181 7.5.1. Агрегатные вычисления по всем записям набора ........................................................ 181 7.5.2. Агрегатные вычисления по связанным записям .......................................................... 182 7.5.3. Агрегатные функции ...................................................................................................... 184


6 Оглавление 7.6. Вычисляемые поля ............................................................................................................... 186 7.7. Функциональные выражения: расширенные инструменты .............................................. 187 7.7.1. Функции СУБД ............................................................................................................... 187 7.7.1.1. Функции для работы со строками ..................................................................... 187 7.7.1.2. Функции для работы с числами ......................................................................... 190 7.7.1.3. Функции для работы с датой и временем ......................................................... 192 7.7.1.4. Функции для сравнения и преобразования значений....................................... 193 7.7.2. Условные выражения СУБД .......................................................................................... 195 7.7.3. Вложенные запросы ....................................................................................................... 196 7.8. Объединение наборов записей ............................................................................................ 198 7.9. Извлечение значений только из заданных полей ............................................................... 198 7.10. Указание базы данных для выборки записей ................................................................... 201 7.11. Асинхронная выборка данных ........................................................................................... 201 Глава 8. Маршрутизация ........................................................................................... 203 8.1. Как работает маршрутизатор? ............................................................................................. 203 8.1.1. Списки маршрутов уровня проекта и уровня приложения ......................................... 204 8.2. Объявление маршрутов ........................................................................................................ 205 8.3. Передача данных в контроллеры......................................................................................... 207 8.4. Именованные маршруты ...................................................................................................... 208 8.5. Имена приложений ............................................................................................................... 208 8.6. Псевдонимы приложений .................................................................................................... 209 8.7. Указание шаблонных путей в виде регулярных выражений ............................................. 210 8.8. Настройки маршрутизатора ................................................................................................. 211 Глава 9. Контроллеры-функции .............................................................................. 212 9.1. Написание контроллеров-функций ..................................................................................... 212 9.1.1. Контроллеры, выполняющие одну задачу .................................................................... 213 9.1.2. Контроллеры, выполняющие несколько задач ............................................................ 214 9.2. Получение сведений о запросе ............................................................................................ 215 9.3. Формирование ответа ........................................................................................................... 218 9.3.1. Низкоуровневые средства для формирования ответа.................................................. 218 9.3.2. Формирование ответа на основе шаблона .................................................................... 220 9.3.3. Класс TemplateResponse: отложенный рендеринг шаблонов ...................................... 221 9.4. Перенаправление .................................................................................................................. 222 9.5. Обратное разрешение интернет-адресов ............................................................................ 223 9.6. Уведомление об ошибках и особых ситуациях .................................................................. 224 9.7. Специальные ответы ............................................................................................................ 226 9.7.1. Потоковый ответ ............................................................................................................. 226 9.7.2. Отправка файлов ............................................................................................................. 227 9.7.3. Отправка данных в формате JSON ................................................................................ 227 9.8. Сокращения Django .............................................................................................................. 228 9.9. Программное разрешение интернет-адресов ..................................................................... 229 9.10. Дополнительные настройки контроллеров....................................................................... 231 9.11. Асинхронные контроллеры-функции ............................................................................... 232 Глава 10. Контроллеры-классы ............................................................................... 235 10.1. Введение в контроллеры-классы ....................................................................................... 235 10.2. Базовые контроллеры-классы ............................................................................................ 236 10.2.1. Контроллер View: диспетчеризация по HTTP-методу ............................................... 236


Оглавление 7 10.2.2. Примесь ContextMixin: создание контекста шаблона ................................................ 238 10.2.3. Примесь TemplateResponseMixin: рендеринг шаблона .............................................. 238 10.2.4. Контроллер TemplateView: все вместе ........................................................................ 239 10.3. Классы, выводящие одну запись ....................................................................................... 240 10.3.1. Примесь SingleObjectMixin: поиск записи .................................................................. 240 10.3.2. Примесь SingleObjectTemplateResponseMixin: рендеринг шаблона на основе найденной записи .................................................................................................... 241 10.3.3. Контроллер DetailView: все вместе ............................................................................. 242 10.4. Классы, выводящие наборы записей ................................................................................. 243 10.4.1. Примесь MultipleObjectMixin: извлечение набора записей ....................................... 243 10.4.2. Примесь MultipleObjectTemplateResponseMixin: рендеринг шаблона на основе набора записей ......................................................................................................... 246 10.4.3. Контроллер ListView: все вместе ................................................................................. 246 10.5. Классы, работающие с формами ....................................................................................... 247 10.5.1. Классы для вывода и валидации форм........................................................................ 247 10.5.1.1. Примесь FormMixin: создание формы ............................................................ 247 10.5.1.2. Контроллер ProcessFormView: вывод и обработка формы ........................... 249 10.5.1.3. Контроллер-класс FormView: создание, вывод и обработка формы ............ 249 10.5.2. Классы для добавления, правки и удаления записей ................................................. 250 10.5.2.1. Примесь ModelFormMixin: создание формы, связанной с моделью............. 251 10.5.2.2. Контроллер CreateView: создание новой записи ............................................ 252 10.5.2.3. Контроллер UpdateView: исправление записи ................................................ 252 10.5.2.4. Примесь DeletionMixin: удаление записи ........................................................ 253 10.5.2.5. Контроллер DeleteView: удаление записи с подтверждением ....................... 254 10.6. Классы для вывода хронологических списков ................................................................. 256 10.6.1. Вывод последних записей ............................................................................................ 256 10.6.1.1. Примесь DateMixin: фильтрация записей по дате .......................................... 256 10.6.1.2. Контроллер BaseDateListView: базовый класс ................................................ 256 10.6.1.3. Контроллер ArchiveIndexView: вывод последних записей ............................. 257 10.6.2. Вывод записей по годам............................................................................................... 258 10.6.2.1. Примесь YearMixin: извлечение года .............................................................. 258 10.6.2.2. Контроллер YearArchiveView: вывод записей за год ...................................... 259 10.6.3. Вывод записей по месяцам .......................................................................................... 260 10.6.3.1. Примесь MonthMixin: извлечение месяца ....................................................... 260 10.6.3.2. Контроллер MonthArchiveView: вывод записей за месяц ............................... 260 10.6.4. Вывод записей по неделям........................................................................................... 261 10.6.4.1. Примесь WeekMixin: извлечение номера недели ............................................ 261 10.6.4.2. Контроллер WeekArchiveView: вывод записей за неделю .............................. 262 10.6.5. Вывод записей по дням ................................................................................................ 262 10.6.5.1. Примесь DayMixin: извлечение заданного числа ........................................... 263 10.6.5.2. Контроллер DayArchiveView: вывод записей за день ..................................... 263 10.6.6. Контроллер TodayArchiveView: вывод записей за текущее число ............................ 264 10.6.7. Контроллер DateDetailView: вывод одной записи за указанное число .................... 264 10.7. Контроллер RedirectView: перенаправление..................................................................... 265 10.8. Контроллеры-классы смешанной функциональности ..................................................... 267 10.9. Асинхронные контроллеры-классы .................................................................................. 268


8 Оглавление Глава 11. Шаблоны и статические файлы: базовые инструменты................... 270 11.1. Настройки проекта, касающиеся шаблонов ..................................................................... 270 11.2. Вывод данных. Директивы ................................................................................................ 275 11.3. Теги шаблонизатора ........................................................................................................... 276 11.4. Фильтры............................................................................................................................... 283 11.5. Наследование шаблонов..................................................................................................... 292 11.6. Включение шаблонов ......................................................................................................... 294 11.7. Обработка статических файлов ......................................................................................... 295 11.7.1. Настройка подсистемы статических файлов .............................................................. 295 11.7.2. Формирование интернет-адресов статических файлов ............................................. 297 Глава 12. Пагинатор ................................................................................................... 299 12.1. Класс Paginator: сам пагинатор. Создание пагинатора ................................................... 299 12.2. Класс Page: часть пагинатора. Вывод пагинатора ........................................................... 302 Глава 13. Формы, связанные с моделями .............................................................. 303 13.1. Создание форм, связанных с моделями ............................................................................ 303 13.1.1. Создание форм с помощью фабрики классов ............................................................ 303 13.1.2. Создание форм путем быстрого объявления .............................................................. 305 13.1.3. Создание форм путем полного объявления ................................................................ 306 13.1.3.1. Как выполняется полное объявление? ............................................................ 306 13.1.3.2. Параметры, поддерживаемые всеми типами полей ....................................... 308 13.1.3.3. Классы полей форм ........................................................................................... 309 13.1.3.4. Классы полей форм, применяемые по умолчанию ........................................ 313 13.1.4. Задание элементов управления .................................................................................... 314 13.1.4.1. Классы элементов управления ......................................................................... 314 13.1.4.2. Элементы управления, применяемые по умолчанию .................................... 317 13.2. Обработка форм .................................................................................................................. 318 13.2.1. Добавление записи посредством формы .................................................................... 318 13.2.1.1. Создание формы для добавления записи ........................................................ 318 13.2.1.2. Повторное создание формы ............................................................................. 318 13.2.1.3. Валидация данных, занесенных в форму ........................................................ 319 13.2.1.4. Сохранение данных, занесенных в форму ...................................................... 320 13.2.1.5. Доступ к данным, занесенным в форму .......................................................... 321 13.2.2. Правка записи посредством формы ............................................................................ 321 13.2.3. Некоторые соображения касательно удаления записей ............................................ 322 13.3. Вывод форм на экран ......................................................................................................... 323 13.3.1. Быстрый вывод форм ................................................................................................... 323 13.3.2. Расширенный вывод форм ........................................................................................... 325 13.4. Валидация в формах ........................................................................................................... 327 13.4.1. Валидация полей формы .............................................................................................. 327 13.4.1.1. Валидация с применением валидаторов ......................................................... 327 13.4.1.2. Валидация путем переопределения методов формы ..................................... 328 13.4.2. Валидация формы ......................................................................................................... 328 Глава 14. Наборы форм, связанные с моделями ................................................... 330 14.1. Создание наборов форм, связанных с моделями ............................................................. 330 14.2. Обработка наборов форм, связанных с моделями ........................................................... 334 14.2.1. Создание набора форм, связанного с моделью .......................................................... 334


Оглавление 9 14.2.2. Повторное создание набора форм ............................................................................... 334 14.2.3. Валидация и сохранение набора форм........................................................................ 335 14.2.4. Доступ к данным, занесенным в набор форм ............................................................. 336 14.2.5. Реализация переупорядочивания записей .................................................................. 337 14.3. Вывод наборов форм на экран ........................................................................................... 338 14.3.1. Быстрый вывод наборов форм .................................................................................... 338 14.3.2. Расширенный вывод наборов форм ............................................................................ 339 14.4. Валидация в наборах форм ................................................................................................ 341 14.5. Встроенные наборы форм .................................................................................................. 342 14.5.1. Создание встроенных наборов форм .......................................................................... 342 14.5.2. Обработка встроенных наборов форм ........................................................................ 342 Глава 15. Разграничение доступа: базовые инструменты .................................. 344 15.1. Как работает подсистема разграничения доступа? .......................................................... 344 15.2. Подготовка подсистемы разграничения доступа ............................................................. 345 15.2.1. Настройка подсистемы разграничения доступа ......................................................... 345 15.2.2. Создание суперпользователя ....................................................................................... 346 15.2.3. Смена пароля пользователя ......................................................................................... 347 15.3. Работа со списками пользователей и групп...................................................................... 347 15.3.1. Список пользователей .................................................................................................. 347 15.3.2. Группы пользователей. Список групп ........................................................................ 349 15.4. Вход, выход и служебные процедуры ............................................................................... 350 15.4.1. Контроллер LoginView: вход на сайт .......................................................................... 350 15.4.2. Контроллер LogoutView: выход с сайта ...................................................................... 352 15.4.3. Контроллер PasswordChangeView: смена пароля ...................................................... 354 15.4.4. Контроллер PasswordChangeDoneView: уведомление об успешной смене пароля ........................................................................................................................................ 355 15.4.5. Контроллер PasswordResetView: отправка письма для сброса пароля ..................... 355 15.4.6. Контроллер PasswordResetDoneView: уведомление об отправке письма для сброса пароля ..................................................................................................................... 357 15.4.7. Контроллер PasswordResetConfirmView: собственно сброс пароля ......................... 358 15.4.8. Контроллер PasswordResetCompleteView: уведомление об успешном сбросе пароля ........................................................................................................................................ 359 15.5. Получение сведений о пользователях ............................................................................... 360 15.5.1. Получение сведений о текущем пользователе ........................................................... 360 15.5.2. Получение пользователей, обладающих заданным правом ...................................... 363 15.6. Авторизация ........................................................................................................................ 364 15.6.1. Авторизация в контроллерах ....................................................................................... 364 15.6.1.1. Авторизация в контроллерах-функциях: непосредственные проверки ........... 364 15.6.1.2. Авторизация в контроллерах-функциях: применение декораторов ............. 365 15.6.1.3. Авторизация в контроллерах-классах ............................................................. 367 15.6.2. Авторизация в шаблонах .............................................................................................. 369 ЧАСТЬ III. РАСШИРЕННЫЕ ИНСТРУМЕНТЫ И ДОПОЛНИТЕЛЬНЫЕ БИБЛИОТЕКИ ............................................................. 371 Глава 16. Модели: расширенные инструменты .................................................... 373 16.1. Управление выборкой полей ............................................................................................. 373 16.2. Связи «многие-со-многими» с дополнительными данными ........................................... 377


10 Оглавление 16.3. Полиморфные связи ........................................................................................................... 380 16.4. Наследование моделей ....................................................................................................... 384 16.4.1. Прямое наследование моделей .................................................................................... 384 16.4.2. Абстрактные модели .................................................................................................... 386 16.4.3. Прокси-модели .............................................................................................................. 387 16.5. Создание своих диспетчеров записей ............................................................................... 388 16.5.1. Создание диспетчеров записей .................................................................................... 388 16.5.2. Создание диспетчеров обратной связи ....................................................................... 390 16.6. Создание своих наборов записей ...................................................................................... 391 16.7. Управление транзакциями ................................................................................................. 393 16.7.1. Автоматическое управление транзакциями ............................................................... 393 16.7.1.1. Режим по умолчанию: каждая операция — в отдельной транзакции........... 394 16.7.1.2. Режим атомарных запросов ............................................................................. 394 16.7.1.3. Режим по умолчанию на уровне контроллера ................................................ 395 16.7.1.4. Режим атомарных запросов на уровне контроллера ...................................... 395 16.7.2. Ручное управление транзакциями ............................................................................... 397 16.7.3. Обработка подтверждения транзакции ....................................................................... 399 Глава 17. Формы и наборы форм: расширенные инструменты и дополнительная библиотека .................................................................................. 400 17.1. Формы, не связанные с моделями ..................................................................................... 400 17.2. Наборы форм, не связанные с моделями .......................................................................... 401 17.3. Расширенные средства для вывода форм и наборов форм ............................................. 403 17.3.1. Указание CSS-стилей у форм ...................................................................................... 403 17.3.2. Настройка выводимых форм ....................................................................................... 403 17.3.3. Настройка наборов форм ............................................................................................. 404 17.3.4. Шаблоны форм, наборов форм и элементов управления .......................................... 405 17.3.4.1. Шаблоны форм .................................................................................................. 406 17.3.4.2. Шаблоны наборов форм ................................................................................... 408 17.3.4.3. Шаблоны элементов управления ..................................................................... 408 17.4. Библиотека Django Simple Captcha: поддержка CAPTCHA ............................................ 410 17.4.1. Установка Django Simple Captcha ............................................................................... 411 17.4.2. Использование Django Simple Captcha ....................................................................... 411 17.4.3. Настройка Django Simple Captcha ............................................................................... 413 17.4.4. Дополнительные команды captcha_clean и captcha_create_pool ............................. 414 17.5. Дополнительные настройки проекта, имеющие отношение к формам ......................... 415 Глава 18. Поддержка баз данных PostgreSQL и библиотека django-localflavor ................................................................................ 416 18.1. Дополнительные инструменты для поддержки PostgreSQL ........................................... 416 18.1.1. Объявление моделей для работы с PostgreSQL.......................................................... 416 18.1.1.1. Поля, специфические для PostgreSQL ............................................................. 416 18.1.1.2. Индексы PostgreSQL ......................................................................................... 419 18.1.1.3. Операционные выражения ............................................................................... 421 18.1.1.4. Условие ExclusionConstraint ............................................................................ 422 18.1.1.5. Расширения PostgreSQL ................................................................................... 424 18.1.1.6. Валидаторы PostgreSQL ................................................................................... 425


Оглавление 11 18.1.2. Запись и выборка данных в PostgreSQL ..................................................................... 427 18.1.2.1. Запись и выборка значений полей в PostgreSQL ............................................ 427 18.1.2.2. Фильтрация записей в PostgreSQL .................................................................. 430 18.1.3. Агрегатные функции PostgreSQL ................................................................................ 435 18.1.4. Функции СУБД, специфичные для PostgreSQL ......................................................... 438 18.1.5. Вложенные запросы PostgreSQL ................................................................................. 438 18.1.6. Полнотекстовая фильтрация PostgreSQL ................................................................... 439 18.1.6.1. Модификатор search ......................................................................................... 439 18.1.6.2. Функции СУБД для полнотекстовой фильтрации .......................................... 440 18.1.6.3. Функции СУБД для фильтрации по похожим словам ................................... 445 18.1.7. Создание форм для работы с PostgreSQL ................................................................... 447 18.1.7.1. Поля форм, специфические для PostgreSQL ................................................... 447 18.1.7.2. Элементы управления, специфические для PostgreSQL ................................ 449 18.2. Библиотека django-localflavor: дополнительные поля для моделей и форм .................. 449 18.2.1. Установка django-localflavor ........................................................................................ 450 18.2.2. Поля модели, предоставляемые django-localflavor .................................................... 450 18.2.3. Поля формы, предоставляемые django-localflavor ..................................................... 451 18.2.4. Элементы управления, предоставляемые django-localflavor ..................................... 451 Глава 19. Шаблоны: расширенные инструменты и дополнительные библиотеки ................................................................................. 452 19.1. Библиотека django-precise-bbcode: поддержка BBCode .................................................. 452 19.1.1. Установка django-precise-bbcode ................................................................................. 452 19.1.2. Поддерживаемые BBCode-теги ................................................................................... 453 19.1.3. Обработка BBCode ....................................................................................................... 454 19.1.3.1. Обработка BBCode при выводе ....................................................................... 454 19.1.3.2. Хранение BBCode в модели ............................................................................. 455 19.1.4. Создание дополнительных BBCode-тегов .................................................................. 456 19.1.5. Создание графических смайликов .............................................................................. 458 19.1.6. Настройка django-precise-bbcode ................................................................................. 458 19.2. Библиотека django-bootstrap5: интеграция с Bootstrap 5 ................................................. 459 19.2.1. Установка django-bootstrap5 ........................................................................................ 460 19.2.2. Использование django-bootstrap5 ................................................................................ 460 19.2.3. Настройка django-bootstrap5 ........................................................................................ 465 19.3. Написание своих фильтров и тегов ................................................................................... 467 19.3.1. Организация исходного кода ....................................................................................... 467 19.3.2. Написание фильтров ..................................................................................................... 467 19.3.2.1. Написание и использование простейших фильтров ...................................... 467 19.3.2.2. Управление заменой недопустимых знаков HTML ....................................... 469 19.3.3. Написание тегов ............................................................................................................ 470 19.3.3.1. Написание тегов, выводящих элементарные значения .................................. 470 19.3.3.2. Написание шаблонных тегов ........................................................................... 472 19.3.4. Регистрация фильтров и тегов ..................................................................................... 473 19.4. Переопределение шаблонов............................................................................................... 474 Глава 20. Обработка выгруженных файлов .......................................................... 476 20.1. Подготовка подсистемы обработки выгруженных файлов ............................................. 476 20.1.1. Настройка подсистемы обработки выгруженных файлов ......................................... 476 20.1.2. Указание маршрута для выгруженных файлов .......................................................... 478


12 Оглавление 20.2. Хранение файлов в моделях .............................................................................................. 479 20.2.1. Типы полей модели, предназначенные для хранения файлов .................................. 479 20.2.2. Поля форм, валидаторы и элементы управления, служащие для указания файлов ........................................................................................................................................ 481 20.2.3. Обработка выгруженных файлов ................................................................................ 482 20.2.4. Вывод выгруженных файлов ....................................................................................... 484 20.2.5. Удаление выгруженного файла ................................................................................... 485 20.3. Хранение путей к файлам в моделях ................................................................................ 485 20.4. Низкоуровневые средства для сохранения выгруженных файлов ................................. 486 20.4.1. Класс UploadedFile: выгруженный файл. Сохранение выгруженных файлов ........ 486 20.4.2. Вывод выгруженных файлов низкоуровневыми средствами ................................... 488 20.5. Библиотека django-cleanup: автоматическое удаление ненужных файлов .................... 489 20.6. Библиотека easy-thumbnails: вывод миниатюр ................................................................. 490 20.6.1. Установка easy-thumbnails............................................................................................ 490 20.6.2. Настройка easy-thumbnails ........................................................................................... 491 20.6.2.1. Пресеты миниатюр ........................................................................................... 491 20.6.2.2. Остальные настройки библиотеки ................................................................... 493 20.6.3. Вывод миниатюр в шаблонах ...................................................................................... 495 20.6.4. Хранение миниатюр в моделях ................................................................................... 496 20.6.5. Дополнительная команда thumbnail_cleanup ............................................................. 497 Глава 21. Разграничение доступа: расширенные инструменты и дополнительная библиотека .................................................................................. 498 21.1. Настройки проекта, касающиеся разграничения доступа ............................................... 498 21.2. Работа с пользователями .................................................................................................... 499 21.2.1. Создание пользователей ............................................................................................... 499 21.2.2. Работа с паролями ........................................................................................................ 499 21.3. Вход и выход ....................................................................................................................... 500 21.4. Валидация паролей ............................................................................................................. 501 21.4.1. Стандартные валидаторы паролей .............................................................................. 501 21.4.2. Написание своих валидаторов паролей ...................................................................... 503 21.4.3. Выполнение валидации паролей ................................................................................. 504 21.5. Библиотека Python Social Auth: регистрация и вход через социальные сети ................ 505 21.5.1. Создание приложения «ВКонтакте» ........................................................................... 505 21.5.2. Установка и настройка Python Social Auth ................................................................. 506 21.5.3. Использование Python Social Auth .............................................................................. 508 21.6. Создание своей модели пользователя ............................................................................... 508 21.7. Создание своих прав пользователя ................................................................................... 510 Глава 22. Посредники и обработчики контекста .................................................. 511 22.1. Посредники ......................................................................................................................... 511 22.1.1. Стандартные посредники ............................................................................................. 511 22.1.2. Порядок выполнения посредников ............................................................................. 512 22.1.3. Написание своих посредников .................................................................................... 513 22.1.3.1. Посредники-функции ........................................................................................ 513 22.1.3.2. Посредники-классы ........................................................................................... 514 22.1.3.3. Асинхронные и универсальные посредники .................................................. 516 22.2. Обработчики контекста ...................................................................................................... 519


Оглавление 13 Глава 23. Cookie, сессии, всплывающие сообщения и подписывание данных ............................................................................................ 521 23.1. Cookie .................................................................................................................................. 521 23.2. Сессии .................................................................................................................................. 524 23.2.1. Настройка сессий .......................................................................................................... 524 23.2.2. Использование сессий .................................................................................................. 526 23.2.3. Дополнительная команда clearsessions ....................................................................... 528 23.3. Всплывающие сообщения .................................................................................................. 528 23.3.1. Настройка всплывающих сообщений ......................................................................... 528 23.3.2. Уровни всплывающих сообщений .............................................................................. 529 23.3.3. Создание всплывающих сообщений ........................................................................... 530 23.3.4. Вывод всплывающих сообщений ................................................................................ 531 23.3.5. Объявление своих уровней всплывающих сообщений ............................................. 533 23.4. Подписывание данных ....................................................................................................... 533 Глава 24. Сигналы ...................................................................................................... 537 24.1. Обработка сигналов ............................................................................................................ 537 24.1.1. Объявление обработчиков сигналов ........................................................................... 537 24.1.2. Явная привязка обработчиков к сигналам .................................................................. 538 24.1.3. Неявная привязка обработчиков к сигналам .............................................................. 539 24.1.4. Отмена привязки обработчиков к сигналам ............................................................... 540 24.2. Встроенные сигналы Django .............................................................................................. 540 24.3. Объявление своих сигналов ............................................................................................... 545 Глава 25. Отправка электронных писем ................................................................ 547 25.1. Настройка подсистемы отправки электронных писем .................................................... 547 25.2. Низкоуровневые инструменты для отправки писем ........................................................ 549 25.2.1. Класс EmailMessage: обычное электронное письмо .................................................. 549 25.2.2. Формирование писем на основе шаблонов ................................................................ 551 25.2.3. Использование соединений. Массовая рассылка писем ........................................... 551 25.2.4. Класс EmailMultiAlternatives: составное письмо ........................................................ 552 25.3. Высокоуровневые инструменты для отправки писем ..................................................... 553 25.3.1. Отправка писем по произвольным адресам ............................................................... 553 25.3.2. Отправка писем зарегистрированным пользователям .............................................. 554 25.3.3. Отправка писем администраторам и редакторам сайта ............................................ 555 25.4. Отправка тестового электронного письма ........................................................................ 556 Глава 26. Кеширование .............................................................................................. 557 26.1. Кеширование на стороне сервера ...................................................................................... 557 26.1.1. Подготовка подсистемы кеширования на стороне сервера ...................................... 557 26.1.1.1. Настройка подсистемы кеширования на стороне сервера ............................... 557 26.1.1.2. Создание таблицы для хранения кеша ............................................................ 562 26.1.2. Высокоуровневые средства кеширования .................................................................. 562 26.1.2.1. Кеширование всего веб-сайта .......................................................................... 562 26.1.2.2. Кеширование на уровне отдельных контроллеров ........................................ 564 26.1.2.3. Управление кешированием .............................................................................. 564 26.1.3. Низкоуровневые средства кеширования .................................................................... 565 26.1.3.1. Кеширование фрагментов веб-страниц ........................................................... 566 26.1.3.2. Кеширование произвольных значений ............................................................ 567 26.1.3.3. Асинхронные инструменты для кеширования произвольных значений ......... 570


14 Оглавление 26.2. Кеширование на стороне клиента ..................................................................................... 570 26.2.1. Автоматическая обработка заголовков ....................................................................... 570 26.2.2. Управление кешированием в контроллерах ............................................................... 571 26.2.2.1. Условная обработка запросов .......................................................................... 571 26.2.2.2. Прямое указание параметров кеширования.................................................... 573 26.2.2.3. Запрет кеширования ......................................................................................... 573 26.2.3. Управление кешированием в посредниках ................................................................ 574 Глава 27. Локализация ............................................................................................... 576 27.1. Локализация строк .............................................................................................................. 576 27.1.1. Пометка локализуемых строк ...................................................................................... 576 27.1.1.1. Пометка локализуемых строк в коде шаблонов ............................................. 577 27.1.1.2. Пометка локализуемых строк в Python-коде .................................................. 579 27.1.2. Создание языковых модулей ....................................................................................... 582 27.1.2.1. Генерирование языковых модулей .................................................................. 582 27.1.2.2. Перевод локализуемых строк ........................................................................... 583 27.1.2.3. Компиляция языковых модулей ...................................................................... 585 27.1.3. Переключение веб-сайта на требуемый язык ............................................................. 586 27.1.3.1. Автоматическое переключение на требуемый язык ...................................... 586 27.1.3.2. Вывод сведений о поддерживаемых языках ................................................... 587 27.1.3.3. Создание языковых редакций веб-сайта ......................................................... 589 27.1.3.4. Переключение на требуемый язык без создания языковых редакций веб-сайта ........................................................................................................................... 591 27.1.4. Дополнительные инструменты для локализации строк ............................................ 593 27.1.5. Настройка локализации строк ..................................................................................... 593 27.2. Локализация форматов ....................................................................................................... 595 27.3. Локализация временны´ х зон .............................................................................................. 596 27.3.1. Реализация переключения веб-сайта на требуемую временну´ю зону ...................... 596 27.3.2. Вывод значений времени и временны´ х отметок в разных временны´ х зонах .......... 598 Глава 28. Административный веб-сайт Django .................................................... 601 28.1. Подготовка административного веб-сайта к работе ........................................................ 601 28.2. Регистрация моделей на административном веб-сайте ................................................... 602 28.3. Редакторы моделей ............................................................................................................. 603 28.3.1. Параметры списка записей .......................................................................................... 603 28.3.1.1. Параметры списка записей: состав выводимого списка ................................ 603 28.3.1.2. Параметры списка записей: фильтрация и сортировка ................................. 608 28.3.1.3. Параметры списка записей: прочие ................................................................. 612 28.3.2. Параметры страниц добавления и правки записей .................................................... 614 28.3.2.1. Параметры страниц добавления и правки записей: набор выводимых полей .................................................................................................. 614 28.3.2.2. Параметры страниц добавления и правки записей: элементы управления ..... 617 28.3.2.3. Параметры страниц добавления и правки записей: прочие .......................... 620 28.3.3. Регистрация редакторов на административном веб-сайте ........................................ 621 28.4. Встроенные редакторы ....................................................................................................... 622 28.4.1. Объявление встроенного редактора ............................................................................ 622 28.4.2. Параметры встроенного редактора ............................................................................. 622 28.4.3. Регистрация встроенного редактора ........................................................................... 624 28.5. Действия .............................................................................................................................. 625


Оглавление 15 Глава 29. Разработка веб-служб REST. Библиотека Django REST framework ...................................................................... 628 29.1. Установка и подготовка к работе Django REST framework ............................................ 629 29.2. Введение в Django REST framework. Вывод данных ....................................................... 631 29.2.1. Сериализаторы .............................................................................................................. 631 29.2.2. Веб-представление JSON ............................................................................................. 632 29.2.3. Вывод данных на стороне клиента .............................................................................. 634 29.2.4. Первый принцип REST: идентификация ресурса по интернет-адресу .................... 635 29.3. Ввод и правка данных ........................................................................................................ 637 29.3.1. Второй принцип REST: идентификация действия по HTTP-методу ....................... 637 29.3.2. Парсеры веб-форм ........................................................................................................ 641 29.4. Контроллеры-классы Django REST framework ................................................................ 642 29.4.1. Контроллер-класс низкого уровня .............................................................................. 642 29.4.2. Контроллеры-классы высокого уровня: комбинированные и простые ................... 643 29.5. Метаконтроллеры ............................................................................................................... 644 29.6. Разграничение доступа в Django REST framework .......................................................... 646 29.6.1. Третий принцип REST: данные клиента хранятся на стороне клиента ................... 646 29.6.2. Классы разграничения доступа ................................................................................... 647 Глава 30. Средства журналирования ...................................................................... 649 30.1. Настройка подсистемы журналирования.......................................................................... 649 30.2. Объект сообщения .............................................................................................................. 650 30.3. Форматировщики ................................................................................................................ 651 30.4. Фильтры............................................................................................................................... 652 30.5. Обработчики ....................................................................................................................... 653 30.6. Регистраторы ....................................................................................................................... 658 30.7. Пример настройки подсистемы журналирования ............................................................ 660 Глава 31. Публикация веб-сайта .............................................................................. 663 31.1. Подготовка веб-сайта к публикации ................................................................................. 663 31.1.1. Написание шаблонов веб-страниц с сообщениями об ошибках ............................... 663 31.1.2. Указание настроек эксплуатационного режима ......................................................... 664 31.1.3. Удаление ненужных данных ........................................................................................ 666 31.1.4. Окончательная проверка веб-сайта ............................................................................. 666 31.1.5. Настройка веб-сайта для работы по протоколу HTTPS ............................................ 668 31.2. Публикация веб-сайта ........................................................................................................ 672 31.2.1. Публикация посредством Uvicorn ............................................................................... 672 31.2.1.1. Подготовка веб-сайта к публикации посредством Uvicorn ........................... 673 31.2.1.2. Запуск и остановка Uvicorn .............................................................................. 674 31.2.2. Другие варианты публикации ...................................................................................... 675 ЧАСТЬ IV. ПРАКТИЧЕСКОЕ ЗАНЯТИЕ: РАЗРАБОТКА ВЕБ-САЙТА ....... 677 Глава 32. Дизайн. Вспомогательные веб-страницы ............................................. 679 32.1. План веб-сайта .................................................................................................................... 679 32.2. Подготовка проекта и приложения main .......................................................................... 680 32.2.1. Создание и настройка проекта..................................................................................... 680 32.2.2. Создание и настройка приложения main .................................................................... 681 32.3. Базовый шаблон .................................................................................................................. 681


16 Оглавление 32.4. Главная веб-страница ......................................................................................................... 688 32.5. Вспомогательные веб-страницы ........................................................................................ 690 Глава 33. Работа с пользователями и разграничение доступа ........................... 693 33.1. Модель пользователя .......................................................................................................... 693 33.2. Основные веб-страницы: входа, профиля и выхода ........................................................ 695 33.2.1. Веб-страница входа ...................................................................................................... 695 33.2.2. Веб-страница пользовательского профиля ................................................................. 697 33.2.3. Реализация выхода ....................................................................................................... 698 33.3. Веб-страницы правки личных данных пользователя ....................................................... 699 33.3.1. Веб-страница правки основных сведений .................................................................. 699 33.3.2. Веб-страница правки пароля........................................................................................ 702 33.4. Веб-страницы регистрации и активации пользователей ................................................. 703 33.4.1. Веб-страницы регистрации нового пользователя ...................................................... 703 33.4.1.1. Форма для занесения сведений о новом пользователе .................................. 703 33.4.1.2. Средства для регистрации пользователя ......................................................... 705 33.4.1.3. Средства для отправки писем с требованиями активации ............................ 707 33.4.2. Веб-страницы активации пользователя ...................................................................... 709 33.5. Веб-страница удаления пользователя ............................................................................... 711 33.6. Инструменты для администрирования пользователей .................................................... 713 Глава 34. Рубрики ....................................................................................................... 715 34.1. Модели рубрик .................................................................................................................... 715 34.1.1. Базовая модель рубрик ................................................................................................. 715 34.1.2. Модель надрубрик ........................................................................................................ 716 34.1.3. Модель подрубрик ........................................................................................................ 717 34.2. Инструменты для администрирования рубрик ................................................................ 718 34.3. Вывод списка рубрик в вертикальной панели навигации ............................................... 719 Глава 35. Объявления ................................................................................................ 722 35.1. Подготовка к обработке выгруженных файлов ................................................................ 722 35.2. Модели объявлений и дополнительных иллюстраций .................................................... 723 35.2.1. Модель самих объявлений ........................................................................................... 723 35.2.2. Модель дополнительных иллюстраций ...................................................................... 726 35.2.3. Реализация удаления объявлений в модели пользователя ........................................ 726 35.3. Инструменты для администрирования объявлений ......................................................... 727 35.4. Вывод объявлений .............................................................................................................. 727 35.4.1. Вывод списка объявлений ............................................................................................ 728 35.4.1.1. Форма поиска и контроллер списка объявлений ............................................ 728 35.4.1.2. Реализация корректного возврата .................................................................... 729 35.4.1.3. Шаблон веб-страницы списка объявлений ..................................................... 731 35.4.2. Веб-страница сведений о выбранном объявлении ..................................................... 734 35.4.3. Вывод последних 10 объявлений на главной веб-странице ...................................... 738 35.5. Работа с объявлениями ....................................................................................................... 738 35.5.1. Вывод объявлений, оставленных текущим пользователем ....................................... 738 35.5.2. Добавление, правка и удаление объявлений .............................................................. 739 Глава 36. Комментарии .............................................................................................. 743 36.1. Подготовка к выводу CAPTCHA ....................................................................................... 743 36.2. Модель комментария .......................................................................................................... 744


Оглавление 17 36.3. Вывод и добавление комментариев .................................................................................. 745 36.4. Отправка уведомлений о новых комментариях ............................................................... 748 Глава 37. Веб-служба REST ....................................................................................... 750 37.1. Веб-служба .......................................................................................................................... 750 37.1.1. Подготовка к разработке веб-службы ......................................................................... 750 37.1.2. Список объявлений ....................................................................................................... 751 37.1.3. Сведения о выбранном объявлении ............................................................................ 752 37.1.4. Вывод и добавление комментариев ............................................................................ 753 37.2. Тестовый фронтенд ............................................................................................................ 755 37.2.1. Введение в Angular ....................................................................................................... 755 37.2.2. Подготовка к разработке фронтенда ........................................................................... 756 37.2.3. Метамодуль приложения AppModule. Маршрутизация в Angular ............................ 757 37.2.4. Компонент приложения AppComponent ...................................................................... 761 37.2.5. Служба BbService. Внедрение зависимостей. Объекты-обещания ........................... 762 37.2.6. Компонент списка объявлений BbListComponent. Директивы. Фильтры. Связывание данных .................................................................................................................. 766 37.2.7. Компонент сведений об объявлении BbDetailComponent. Двустороннее связывание данных .......................................................................................... 770 Заключение ................................................................................................................... 775 Приложение. Описание электронного архива ....................................................... 777 Предметный указатель .............................................................................................. 779


18 Оглавление


Предисловие Django — популярнейший в мире веб-фреймворк, написанный на языке Python, и один из наиболее распространенных веб-фреймворков в мире. Появившись в 2005 году — именно тогда вышла его первая версия, — он до сих пор остается «на коне». Что такое веб-фреймворк? Фреймворк (от англ. framework — каркас) — это программная библиотека, реализующая бо´льшую часть типовой функциональности разрабатываемого продукта. То есть в полном смысле слова каркас, на который разработчик конкретного продукта «навешивает» свои узлы, механизмы и детали декора. Веб-фреймворк — это фреймворк для программирования веб-сайтов. Как правило, он обеспечивает следующую типовую функциональность:  взаимодействие с базой данных — посредством единых инструментов, независимых от конкретной СУБД;  обработка клиентских запросов — в частности, определение, какая страница запрашивается;  генерирование запрашиваемых веб-страниц на основе шаблонов;  разграничение доступа — допуск к закрытым страницам только зарегистрированных пользователей и только после выполнения ими входа;  обработка данных, занесенных посетителями в веб-формы, — в частности, проверка их на корректность;  получение и сохранение файлов, выгруженных пользователями;  рассылка электронных писем;  кеширование сгенерированных страниц на стороне сервера — для повышения производительности;  локализация — перевод сайта на другие языки.


20 Предисловие Почему Django?  Django — это современные стандарты веб-разработки: схема «модель-контроллер-шаблон», использование миграций для внесения изменений в базу данных и принцип «написанное однажды применяется везде» (или, другими словами, «не повторяйся»).  Django — это полнофункциональный фреймворк. Для написания типичного сайта достаточно его одного. Никаких дополнительных библиотек, необходимых, чтобы наше веб-творение хотя бы заработало, ставить не придется.  Django — это высокоуровневый фреймворк. Типовые задачи, наподобие соединения с базой данных, обработки данных, полученных от пользователя, сохранения выгруженных пользователем файлов, он выполняет самостоятельно. А еще он предоставляет полнофункциональную подсистему разграничения доступа и исключительно мощный и удобно настраиваемый административный веб-сайт, которые в случае применения любого другого фреймворка нам пришлось бы писать самостоятельно.  Django — это удобство разработки. Легкий и быстрый отладочный веб-сервер, развитый механизм миграций, уже упомянутый административный веб-сайт — все это существенно упрощает программирование.  Django — это дополнительные библиотеки. Нужен вывод графических миниатюр? Требуется обеспечить аутентификацию посредством социальных сетей? Необходима поддержка CAPTCHA? На диске копятся «мусорные» файлы? Ставьте соответствующую библиотеку — и дело в шляпе!  Django — это Python. Исключительно мощный и, вероятно, самый лаконичный язык из всех, что применяются в промышленном программировании. Эта книга посвящена Django. Она описывает его наиболее важные и часто применяемые на практике функциональные возможности, ряд низкоуровневых инструментов, которые также могут пригодиться во многих случаях, и некоторые дополнительные библиотеки. А в конце в качестве практического упражнения рассказывает о разработке полнофункционального сайта электронной доски объявлений. ВНИМАНИЕ! Автор предполагает, что читатели этой книги знакомы с языками HTML, CSS, JavaScript, Python, принципами работы СУБД и имеют базовые навыки в веб-разработке. В книге все это описываться не будет. ЭЛЕКТРОННОЕ ПРИЛОЖЕНИЕ Содержит программный код сайта электронной доски объявлений и доступно на сервере издательства «БХВ» по ссылке https://zip.bhv.ru/9785977517744.zip, а также со страницы книги на сайте https://bhv.ru/ (см. приложение).


Предисловие 21 Что нового в Django 4.1 и новой книге? С момента написания автором предыдущей книги, посвященной Django 3.0, вышли целых четыре версии этого фреймворка: 3.1, 3.2, 4.0 и 4.1. В них появилось множество полезных нововведений. К числу наиболее значительных можно отнести:  возможность указания типа у неявно создаваемых автоинкрементных полей — см. разд. 3.3.2 и 3.4.2;  новый механизм выбора конфигурационного класса приложения — см. разд. 3.4.2;  поле модели JSONField, доступное для баз данных всех поддерживаемых форматов, — см. разд. 4.2.2;  аналогичное поле формы JSONField — см. разд. 13.1.3.3;  значительно расширенный формат описания индексов — см. разд. 4.4;  поддержка функциональных выражений в условиях типа UniqueConstraint — см. разд. 4.4;  асинхронные инструменты для работы с данными — см. разд. 6.10 и 7.11;  асинхронные контроллеры, функции и классы, — см. разд. 9.11 и 10.9;  вывод форм путем рендеринга на основе шаблонов — см. разд. 17.3.4;  асинхронные посредники — см. разд. 22.1.3.3;  новый класс, реализующий кеширование посредством программы Memcached, — см. разд. 26.1.1.1;  встроенные инструменты для взаимодействия с СУБД Redis — см. разд. 26.1.1.1;  декоратор display(), задающий параметры функциональных полей для административного веб-сайта, — см. разд. 28.3.1.1 и 28.3.1.3;  декоратор action(), оформляющий действия для административного веб-сайта, — см. разд. 28.5. В новое издание книги добавлен следующий материал:  настройка Django-проекта на работу с несколькими базами данных — в разд. 3.6;  локализация сайтов — в главу 27. Использованные программные продукты Автор применял в работе над книгой следующие версии ПО:  Microsoft Windows 11, русская 64-разрядная редакция со всеми установленными обновлениями;  Python — 3.10.6, 64-разрядная редакция;  Django — 4.1;  Django Simple Captcha — 0.5.17;


22 Предисловие  django-precise-bbcode — 1.2.15;  django-localflavor — 3.1;  django-bootstrap5 — 22.1;  Pillow — 9.3.0;  django-cleanup — 6.0.0;  easy-thumbnails — 2.8.3;  Python Social Auth — 5.0.0;  pymemcache — 4.0.0;  redis — 4.3.4;  Django REST framework — 3.14.0;  django-cors-headers — 3.13.0;  Uvicorn — 0.20.0;  Node.js — 19.2.0, 64-разрядная редакция;  Angular — 15.0.2. Типографские соглашения В книге будут часто приводиться форматы написания различных языковых конструкций, применяемых в Python и Django. В них использованы особые типографские соглашения, приведенные далее.  В угловые скобки (<>) заключаются наименования различных значений, которые дополнительно выделяются курсивом. В реальный код, разумеется, должны быть подставлены конкретные значения. Например: django-admin startproject <имя проекта> Здесь вместо подстроки имя проекта должно быть подставлено реальное имя проекта.  В квадратные скобки ([]) заключаются необязательные фрагменты кода. Например: django-admin startproject <имя проекта> [<путь к папке проекта>] Здесь путь к папке проекта может указываться, а может и отсутствовать.  Вертикальной чертой (|) разделяются различные варианты языковой конструкции, из которых следует указать лишь какой-то один. Пример: get_next_by_<имя поля> | get_previous_by_<имя поля>([<условия поиска>]) Здесь следует поставить либо get_next_by_<имя поля>, либо get_previous_by_ <имя поля>.  Слишком длинные, не помещающиеся на одной строке языковые конструкции автор разрывал на несколько строк и в местах разрывов ставил знак . Например:


Предисловие 23 {% bootstrap_field form.keyword show_label=False  wrapper_class='col-12' %} Приведенный код разбит на две строки, но должен быть набран в одну. Символ  при этом нужно удалить.  Троеточием (. . .) помечены фрагменты кода, пропущенные ради сокращения объема текста. Пример: INSTALLED_APPS = [ 'bboard', . . . ] Здесь пропущены все элементы списка, присваиваемого переменной INSTALLED_ APPS, кроме первого. Обычно такое можно встретить в исправленных впоследствии фрагментах кода — приведены лишь собственно исправленные выражения, а оставшиеся неизмененными пропущены. Также троеточие используется, чтобы показать, в какое место должен быть вставлен вновь написанный код — в начало исходного фрагмента, в его конец или в середину, между уже присутствующими в нем выражениями.  Полужирным шрифтом выделен вновь добавленный и исправленный код. Пример: class Bb(models.Model): . . . rubric = models.ForeignKey('Rubric', null=True, on_delete=models.PROTECT, verbose_name='Рубрика') Здесь вновь добавлен код, объявляющий в модели Bb поле rubric.  Зачеркнутым шрифтом выделяется код, подлежащий удалению. Пример: <a class="nav-link" href="#">Грузовой</a> {% for rubric in rubrics %} . . . Тег <a>, создающий гиперссылку, следует удалить. ЕЩЕ РАЗ ВНИМАНИЕ! Все приведенные здесь типографские соглашения имеют смысл лишь в форматах написания языковых конструкций Python и Django. В реальном программном коде используются только знак , троеточие, полужирный и зачеркнутый шрифт.


24 Предисловие


ЧАСТЬ I Вводный курс Глава 1. Основные понятия Django. Вывод данных Глава 2. Связи. Ввод данных. Статические файлы Django


ГЛАВА 1 Основные понятия Django. Вывод данных В этой главе мы начнем знакомство с фреймворком Django с разработки простенького веб-сайта — электронной доски объявлений. НА ЗАМЕТКУ Эта книга не содержит описания Python. Документацию по этому языку программирования можно найти на его «домашнем» сайте https://www.python.org/. 1.1. Установка фреймворка Установить Django проще всего посредством утилиты pip, поставляемой в составе Python и выполняющей установку дополнительных библиотек из интернетрепозитория PyPI. Чтобы установить версию 4.1 фреймворка, описываемую в этой книге, запустим командную строку и введем в ней такую команду: pip install django~=4.1 Установить Django также можно подачей команды: pip install django Однако в этом случае будет установлена наиболее актуальная на текущий момент версия, и код, представленный в этой книге, может на ней не заработать. ВНИМАНИЕ! Если исполняющая среда Python установлена в папке Program Files или Program Files (x86), то для установки любых дополнительных библиотек командную строку следует запустить с повышенными правами. Для этого надо найти в меню Пуск пункт Командная строка (в зависимости от версии Windows он может находиться в группе Стандартные или Служебные), щелкнуть на нем правой кнопкой мыши и выбрать в появившемся контекстном меню пункт Запуск от имени администратора (в Windows 10 и 11 этот пункт находится в подменю Дополнительно). Помимо Django, будут установлены библиотеки tzdata (содержит список часовых поясов), sqlparse (служит для разбора SQL-кода) и asgiref (реализует интерфейс ASGI, посредством которого эксплуатационный веб-сервер взаимодействует с сайDjango


28 Часть I. Вводный курс том, написанным на Django, и который мы рассмотрим в главе 31), необходимые фреймворку для работы. Не удаляйте эти библиотеки! Спустя некоторое время установка закончится, о чем pip нам обязательно сообщит (приведены номера версий Django и дополнительных библиотек, актуальные на момент подготовки книги; порядок следования библиотек может быть другим): Successfully installed asgiref-3.5.2 django-4.1 sqlparse-0.4.2 tzdata-2022.2 Теперь можно начинать разработку нашего первого веб-сайта. 1.2. Проект Django Первое, что нам нужно сделать, — создать новый проект. Проектом называется совокупность всего программного кода, составляющего разрабатываемый сайт. Физически он представляет собой папку, в которой находятся папки и файлы с исходным кодом (назовем ее папкой проекта). Создадим новый, пока еще пустой проект Django, которому дадим имя samplesite. Для этого в запущенной ранее командной строке перейдем в папку, в которой должна находиться папка проекта, и отдадим команду: django-admin startproject samplesite Утилита django-admin служит для выполнения разнообразных административных задач. В частности, команда startproject указывает ей создать новый проект с именем, записанным после этой команды. В папке, в которую мы ранее перешли, будет создана следующая структура файлов и папок: samplesite manage.py samplesite __init__.py asgi.py settings.py urls.py wsgi.py «Внешняя» папка samplesite — это, как нетрудно догадаться, и есть папка проекта. Как видим, ее имя совпадает с именем проекта, записанным в вызове утилиты django-admin. А содержимое этой папки таково:  manage.py — программный файл с кодом одноименной служебной утилиты, выполняющей различные действия над проектом;  «внутренняя» папка samplesite — пакет языка Python, содержащий модули, которые относятся к проекту целиком и задают его конфигурацию (в частности, ключевые настройки). Имя этого пакета совпадает с именем проекта, и менять его не стоит — в противном случае придется вносить в код обширные правки.


Глава 1. Основные понятия Django. Вывод данных 29 В документации по Django этот пакет не имеет какого-либо ясного и однозначного названия. Поэтому, чтобы избежать путаницы, давайте назовем его пакетом конфигурации. Пакет конфигурации включает в себя такие модули: • __init__.py — пустой файл, сообщающий Python, что папка, в которой он находится, является полноценным пакетом; • settings.py — модуль с настройками проекта. Включает описание конфигурации базы данных проекта, пути ключевых папок, важные параметры, связанные с безопасностью, и пр.; • urls.py — модуль с маршрутами уровня проекта (о них мы поговорим позже); • wsgi.py — модуль, связывающий проект с веб-сервером посредством интерфейса WSGI; • asgi.py — модуль, связывающий проект с веб-сервером через интерфейс ASGI. Модули wsgi.py и asgi.py используются при публикации готового сайта в Интернете. Мы будет рассматривать их в главе 31. Еще раз отметим, что пакет конфигурации хранит настройки, относящиеся к самому проекту и влияющие на все приложения, которые входят в состав этого проекта (о приложениях мы поведем разговор очень скоро). Проект Django мы можем поместить в любое место файловой системы компьютера. Мы также можем переименовать папку проекта. В результате всего этого проект не потеряет своей работоспособности. 1.3. Отладочный веб-сервер Django В состав Django входит отладочный веб-сервер, написанный на самом языке Python. Чтобы запустить его, следует в командной строке перейти непосредственно в папку проекта (именно в нее, а не в папку, в которой находится папка проекта!) и отдать команду: manage.py runserver Здесь мы пользуемся уже утилитой manage.py, сгенерированной программой djangoadmin при создании проекта. Команда runserver, которую мы записали после имени этой утилиты, как раз и запускает отладочный веб-сервер. Последний предупредит о том, что существует 18 еще не примененных миграций (о них разговор пойдет очень скоро). Пока не будем обращать внимания на это предупреждение. Далее сервер сообщит, что сайт успешно запущен (конечно, если его код не содержит ошибок) и доступен по интернет-адресу http://127.0.0.1:8000/ (или http:// localhost:8000/). Как видим, отладочный сервер по умолчанию работает через TCPпорт 8000 (впрочем, при необходимости можно использовать другой порт).


30 Часть I. Вводный курс Запустим веб-обозреватель и наберем в нем один из приведенных ранее интернетадресов нашего сайта. Мы увидим информационную страничку, предоставленную самим Django и сообщающую, что сайт, хоть еще и «пуст», но в целом работает (рис. 1.1). Для остановки отладочного веб-сервера достаточно нажать комбинацию клавиш <Ctrl>+<Break> или <Ctrl>+<C>. Рис. 1.1. Информационная веб-страница Django, сообщающая о работоспособности вновь созданного «пустого» веб-сайта 1.4. Приложения Приложение в терминологии Django — это отдельный фрагмент функциональности разрабатываемого сайта, более или менее независимый от других таких же фрагментов и входящий в состав проекта. Приложение может реализовывать работу всего сайта, его отдельного раздела или же какой-либо внутренней подсистемы сайта, используемой другими приложениями. Любое приложение представляется обычным пакетом Python (пакет приложения), в котором содержатся модули с программным кодом. Этот пакет находится в папке


Глава 1. Основные понятия Django. Вывод данных 31 проекта — там же, где располагается пакет конфигурации. Имя пакета приложения станет именем самого приложения. Нам нужно сделать так, чтобы наш сайт выводил перечень объявлений, оставленных посетителями. Для этого мы создадим новое приложение, которое незатейливо назовем bboard. Остановим отладочный веб-сервер. В командной строке проверим, находимся ли мы в папке проекта, и наберем команду: manage.py startapp bboard Команда startapp утилиты manage.py запускает создание нового «пустого» приложения, имя которого указано после этой команды. Посмотрим, что создала утилита manage.py. Прежде всего это папка bboard, формирующая одноименный пакет приложения и расположенная в папке проекта. В ней находятся следующие папки и файлы:  migrations — папка вложенного пакета, в котором будут храниться сгенерированные Django миграции (о них разговор пойдет позже). Пока что в папке находится лишь пустой файл __init__.py, помечающий ее как полноценный пакет Python;  __init__.py — пустой файл, сигнализирующий исполняющей среде Python, что эта папка — пакет;  admin.py — модуль административных настроек и классов-редакторов;  apps.py — модуль с настройками приложения;  models.py — модуль с моделями;  tests.py — модуль с тестирующими процедурами;  views.py — модуль с контроллерами. ВНИМАНИЕ! Подсистема тестирования кода, реализованная в Django, в этой книге не рассматривается, поскольку автор не считает ее сколь-нибудь полезной. Зарегистрируем только что созданное приложение в проекте. Найдем в пакете конфигурации файл settings.py (о котором уже упоминалось ранее), откроем его в текстовом редакторе и отыщем следующий фрагмент кода: INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', ] Список, хранящийся в переменной INSTALLED_APPS, содержит все приложения, зарегистрированные в проекте и участвующие в его работе. Изначально в этом списке


32 Часть I. Вводный курс присутствуют только стандартные приложения, входящие в состав Django и реализующие различные встроенные подсистемы фреймворка. Так, приложение django. contrib.auth реализует подсистему разграничения доступа, а приложение django. contrib.sessions — подсистему, обслуживающую серверные сессии. В этой «теплой» компании явно не хватает нашего приложения bboard. Добавим его, включив в начало списка новый элемент, содержащий строку с именем пакета приложения1 : INSTALLED_APPS = [ 'bboard', . . . ] Сохраним и закроем файл settings.py. Но запускать отладочный веб-сервер пока не станем. Вместо этого сразу же напишем первый в нашей практике Django-программирования контроллер. 1.5. Контроллеры Контроллер Django — это код, запускаемый при обращении по интернет-адресу определенного формата и выводящий на экран определенную веб-страницу. ВНИМАНИЕ! В документации по Django используется термин «view» (вид, или представление). Автор книги считает его неудачным и предпочитает применять термин «контроллер», тем более что это устоявшееся название программных модулей такого типа. Контроллер Django может представлять собой как функцию (контроллер-функция), так и класс (контроллер-класс). Первые более универсальны, но зачастую трудоемки в программировании, вторые позволяют выполнить типовые задачи, наподобие вывода списка каких-либо позиций, минимумом кода. И первые, и вторые мы обязательно рассмотрим в последующих главах. Для хранения кода контроллеров изначально предназначается модуль views.py, создаваемый в каждом пакете приложения. Однако ничто не мешает нам поместить контроллеры в другие модули. Напишем контроллер, который будет выводить... нет, не список объявлений — этого списка у нас пока нет, а пока только текст, сообщающий, что будущие посетители сайта со временем увидят на этой страничке список объявлений. Это будет контроллер-функция. Откроем модуль views.py пакета приложения bboard, удалим имеющийся там небольшой код и заменим его кодом из листинга 1.1. 1 Полужирным шрифтом здесь помечен добавленный или исправленный код (подробности о типографских соглашениях — в предисловии).


Глава 1. Основные понятия Django. Вывод данных 33 Листинг 1.1. Простейший контроллер-функция, выводящий текстовое сообщение from django.http import HttpResponse def index(request): return HttpResponse("Здесь будет выведен список объявлений.") Наш контроллер — это, собственно, функция index(). Единственное, что она делает, — отправляет клиенту текстовое сообщение «Здесь будет выведен список объявлений». Но это только пока... Любой контроллер-функция в качестве единственного обязательного параметра принимает объект класса HttpRequest, хранящий различные сведения о полученном клиентском запросе: запрашиваемый интернет-адрес, данные, полученные от посетителя, служебную информацию от самого веб-обозревателя и пр. По традиции этот параметр называется request. В нашем случае он никак не используется. В теле функции мы создаем объект класса HttpResponse (он объявлен в модуле django.http), который будет представлять серверный ответ, отправляемый клиенту. Содержимое этого ответа — собственно текстовое сообщение — указываем единственным параметром конструктора этого класса. Готовый объект ответа возвращаем в качестве результата. Что ж, теперь мы с гордостью можем считать себя программистами — поскольку уже самостоятельно написали какой-никакой программный код. Осталось запустить отладочный веб-сервер, набрать в веб-обозревателе адрес вида http:// localhost:8000/bboard/ и посмотреть, что получится... Минуточку! А с чего мы взяли, что при наборе такого интернет-адреса Django запустит на выполнение именно написанный нами контроллер-функцию index()? Ведь мы нигде явно не связали интернет-адрес с контроллером. Но как это сделать?.. 1.6. Маршруты и маршрутизатор Сделать это очень просто. Нужно всего лишь:  объявить связь пути определенного формата (шаблонного пути) с определенным контроллером — иначе говоря, маршрут. Путь — это часть интернет-адреса, находящаяся между адресом хоста и набором GET-параметров (например, интернет-адрес http://localhost:8000/bboard/ 34/edit/ содержит путь bboard/34/edit/). Шаблонный путь должен завершаться символом слеша. Напротив, начальный слеш в нем не ставится;  оформить все объявленные нами маршруты в виде списка маршрутов строго определенного формата, чтобы подсистема маршрутизатора смогла использовать готовый список в работе.


34 Часть I. Вводный курс При поступлении любого запроса от клиента Django выделяет из запрашиваемого интернет-адреса путь, который передает маршрутизатору. Последний последовательно сравнивает его с шаблонными путями из списка маршрутов. Как только будет найден маршрут, чей шаблонный путь совпадает с выделенным из запроса (совпавший маршрут), маршрутизатор передает управление контроллеру, записанному в этом маршруте. Чтобы при запросе по интернет-адресу http://localhost:8000/bboard/ запускался только что написанный нами контроллер index(), нам нужно связать его с шаблонным путем bboard/. В разд. 1.2, знакомясь с проектом, мы заметили хранящийся в пакете конфигурации модуль urls.py, в котором записываются маршруты уровня проекта. Откроем этот модуль в текстовом редакторе и посмотрим, что он содержит (листинг 1.2). Листинг 1.2. Изначальное содержимое модуля urls.py пакета конфигурации from django.contrib import admin from django.urls import path urlpatterns = [ path('admin/', admin.site.urls), ] Список маршрутов, оформленный в виде обычного списка Python, присваивается переменной urlpatterns. Каждый элемент списка маршрутов (т. е. каждый маршрут) должен представляться в виде результата, возвращаемого функцией path() из модуля django.urls. Последняя в качестве параметров принимает строку с шаблонным путем и ссылку на контроллер-функцию. В качестве второго параметра функции path() также можно передать список маршрутов уровня приложения. Кстати, этот вариант демонстрируется в выражении, задающем единственный маршрут в листинге 1.2. Мы рассмотрим его потом. А сейчас добавим в список новый маршрут, связывающий шаблонный путь bboard/ и контроллер-функцию index(). Для чего дополним имеющийся в модуле urls.py код согласно листингу 1.3. Листинг 1.3. Новое содержимое модуля urls.py пакета конфигурации from django.contrib import admin from django.urls import path from bboard.views import index urlpatterns = [ path('bboard/', index), path('admin/', admin.site.urls), ]


Глава 1. Основные понятия Django. Вывод данных 35 Сохраним исправленный модуль, запустим отладочный веб-сервер и наберем в вебобозревателе интернет-адрес http://localhost:8000/bboard/. Мы увидим текстовое сообщение, сгенерированное нашим контроллером (рис. 1.2). Рис. 1.2. Результат работы нашего первого контроллера — простое текстовое сообщение Что ж, наши первые контроллер и маршрут работают, и этому можно порадоваться. Но лишь до поры до времени. Как только мы начнем создавать сложные сайты, состоящие из нескольких приложений, количество маршрутов в списке вырастет до таких размеров, что мы просто запутаемся в них. Поэтому создатели Django настоятельно рекомендуют применять для формирования списков маршрутов другой подход, о котором мы сейчас поговорим. Маршрутизатор Django при просмотре списка маршрутов не требует, чтобы путь, полученный из клиентского запроса (реальный), и шаблонный путь, записанный в очередном маршруте, совпадали полностью. Достаточно лишь того факта, что шаблонный путь совпадает с началом реального. Как было сказано ранее, функция path() позволяет указать во втором параметре вместо ссылки на контроллер-функцию другой, вложенный, список маршрутов. В таком случае маршрутизатор, найдя совпадение, удалит из реального пути его начальную часть (префикс), совпавшую с шаблонным путем, и приступит к просмотру маршрутов из вложенного списка, используя для сравнения реальный путь уже без префикса. Исходя из всего этого, мы можем создать иерархию списков маршрутов. В списке из пакета конфигурации (списке маршрутов уровня проекта) запишем маршруты, которые указывают на вложенные списки маршрутов, принадлежащие отдельным приложениям (списки маршрутов уровня приложения). А в последних непосредственно запишем нужные контроллеры. Начнем со списка маршрутов уровня приложения bboard. Создадим в пакете этого приложения (т. е. в папке bboard) модуль urls.py и занесем в него код из листинга 1.4. Листинг 1.4. Код модуля urls.py пакета приложения bboard from django.urls import path from .views import index urlpatterns = [ path('', index), ]


36 Часть I. Вводный курс Наконец, исправим код модуля urls.py из пакета конфигурации, как показано в листинге 1.5. Листинг 1.5. Окончательный код модуля urls.py пакета конфигурации from django.contrib import admin from django.urls import path, include urlpatterns = [ path('bboard/', include('bboard.urls')), path('admin/', admin.site.urls), ] Вложенный список маршрутов, указываемый во втором параметре функции path(), должен представлять собой результат, возвращенный функцией include() из модуля django.urls. В качестве единственного параметра эта функция принимает строку с путем к модулю, где записан вложенный список маршрутов. Как только наш сайт получит клиентский запрос по интернет-адресу http:// localhost:8000/bboard/, маршрутизатор обнаружит, что присутствующий в интернет-адресе путь совпадает с шаблонным путем bboard/, записанным в первом маршруте из листинга 1.5. Он удалит из реального пути префикс, соответствующий шаблонному пути, и получит новый путь — пустую строку. Этот путь совпадет с единственным маршрутом из вложенного списка (см. листинг 1.4), в результате чего запустится записанный в этом маршруте контроллер-функция index(), и на экране появится уже знакомое нам текстовое сообщение (см. рис. 1.2). Поскольку зашла речь о вложенных списках маршрутов, давайте посмотрим на выражение, создающее второй маршрут из списка уровня проекта: path('admin/', admin.site.urls), Этот маршрут связывает шаблонный путь admin/ со списком маршрутов из свойства urls объекта класса AdminSite, который хранится в переменной site из модуля django.contrib.admin и представляет текущий административный веб-сайт Django. Следовательно, набрав интернет-адрес http://localhost:8000/admin/, мы попадем на этот административный сайт (разговор о нем будет позже). 1.7. Модели Настала пора сделать так, чтобы вместо намозолившего глаза текстового сообщения выводились реальные объявления, хранящиеся в таблице базы данных. Для этого нам понадобится прежде всего объявить модель. Модель — это класс, предназначенный для работы с определенной таблицей в базе данных (ее называют обслуживаемой): создания в ней записей и их выборки, в том числе с применением фильтрации и сортировки. Объект класса модели представляет отдельную запись этой таблицы и предоставляет инструменты для извлечения значений из полей этой записи, ее правки и удаления.


Глава 1. Основные понятия Django. Вывод данных 37 Класс модели Django должен содержать, прежде всего, полное описание всех полей, которые присутствуют в обслуживаемой таблице, включая их имена, типы и дополнительные параметры (например, максимально допустимую длину хранимого значения и значение по умолчанию). Также модель может содержать описания индексов, присутствующих в таблице, и параметры самой этой таблицы. Это необходимо для того, чтобы программные инструменты, предназначенные для работы с данными из обслуживаемой таблицы и наследуемые от базового класса, успешно работали. Модели объявляются в модуле models.py пакета приложения. Изначально этот модуль пуст. Объявим модель Bb, представляющую объявление, со следующими полями:  title — заголовок объявления с названием продаваемого товара (тип — строковый, длина — 50 символов);  content — сам текст объявления, описание товара (тип — memo);  price — цена (тип — вещественное число);  published — дата публикации (тип — временна´я отметка, т. е. значение даты и времени, значение по умолчанию — текущие дата и время, индексированное). Все поля сделаем обязательными для заполнения. Завершим работу отладочного веб-сервера. Откроем модуль models.py пакета приложения bboard и запишем в него код из листинга 1.6. Листинг 1.6. Код модуля models.py пакета приложения bboard from django.db import models class Bb(models.Model): title = models.CharField(max_length=50) content = models.TextField() price = models.FloatField() published = models.DateTimeField(auto_now_add=True, db_index=True) Модель должна быть подклассом класса Model из модуля django.db.models. Отдельные поля модели объявляются в виде атрибутов класса, которым присваиваются объекты классов, представляющих поля разных типов и объявленных в том же модуле. Параметры полей указываются в конструкторах классов полей в виде значений именованных параметров. Рассмотрим использованные нами классы полей и их параметры:  CharField — обычное строковое поле ограниченной длины. Максимально допустимая длина сохраняемого значения указывается параметром max_length конструктора;  TextField — текстовое поле неограниченной длины, или memo-поле;


38 Часть I. Вводный курс  FloatField — поле для хранения вещественных чисел ;  DateTimeField — поле для хранения временно´й отметки. Присвоив параметру auto_now_add конструктора значение True, мы предпишем Django при создании новой записи заносить в это поле текущие дату и время. А параметр db_index при присваивании ему значения True укажет создать для этого поля индекс (при выводе объявлений мы будем сортировать их по убыванию даты публикации, и индекс здесь пригодится). Практически всегда таблицы баз данных имеют поле для хранения ключей — уникальных значений, однозначно идентифицирующих записи (ключевое поле). Как правило, это поле целочисленного типа и помечено как автоинкрементное — тогда сама СУБД будет заносить в него уникальные номера. В моделях Django такое поле явно объявлять не надо — фреймворк создаст его самостоятельно. Сохраним исправленный модуль. Сейчас мы сгенерируем на основе записанной в нем модели миграцию, которая создаст в базе данных все необходимые структуры. НА ЗАМЕТКУ По умолчанию вновь созданный проект Django настроен на использование базы данных в формате SQLite, хранящейся в файле db.sqlite3 в папке проекта. Эта база данных создается при первом запуске проекта на выполнение. 1.8. Миграции Миграция — это программный модуль, вносящий заданные изменения в структуру базы данных: создающий таблицы, создающий, изменяющий и удаляющий поля и индексы в существующих таблицах, изменяющий и удаляющий существующие таблицы. Миграция генерируется самим Django при подаче определенной команды. При этом фреймворк сравнивает текущую структуру базы данных с описанной в моделях и генерирует миграцию, преобразующую структуру базы таким образом, чтобы она соответствовала описанной в моделях. Так, если добавить в код приложения новую модель и изменить параметры поля в другой модели, будет создана миграция, создающая новую таблицу и изменяющая параметры поля в существующей таблице. Чтобы сгенерировать нашу первую миграцию, проверим, остановлен ли отладочный веб-сервер и находимся ли мы в папке проекта, и дадим команду: manage.py makemigrations bboard Команда makemigrations утилиты manage.py запускает генерирование миграций для всех моделей, объявленных в указанном приложении (у нас — bboard) и изменившихся с момента предыдущего генерирования миграций. Модули с миграциями сохраняются в пакете migrations, находящемся в пакете приложения. Модуль с кодом первой миграции получит имя 0001_initial.py. Откроем его в текстовом редакторе и посмотрим на хранящийся в нем код (листинг 1.7).


Глава 1. Основные понятия Django. Вывод данных 39 Листинг 1.7. Код миграции, создающей структуры для модели Bb from django.db import migrations, models class Migration(migrations.Migration): initial = True dependencies = [ ] operations = [ migrations.CreateModel( name='Bb', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('title', models.CharField(max_length=50)), ('content', models.TextField()), ('price', models.FloatField()), ('published', models.DateTimeField(auto_now_add=True, db_index=True)), ], ), ] Код миграции вполне понятен и напоминает код написанной ранее модели. Создаваемая в базе данных таблица будет содержать поля id, title, content, price и published. Ключевое поле id для хранения уникальных номеров записей Django создаст самостоятельно. НА ЗАМЕТКУ Инструменты Django для программирования миграций описаны на страницах: https://docs.djangoproject.com/en/4.1/topics/migrations/ и https://docs.djangoproject.com/en/4.1/howto/writing-migrations/. Миграция при выполнении порождает команды на языке SQL, создающие в базе необходимые структуры. Посмотрим на SQL-код, создаваемый нашей миграцией, задав в командной строке команду: manage.py sqlmigrate bboard 0001 После команды sqlmigrate, выводящей SQL-код, мы поставили имя приложения и числовую часть имени модуля с миграцией. Прямо в командной строке мы получим такой результат (для удобства чтения был переформатирован): BEGIN; -- -- Create model Bb -- CREATE TABLE "bboard_bb" ( "id" integer NOT NULL PRIMARY KEY AUTOINCREMENT,


40 Часть I. Вводный курс "title" varchar(50) NOT NULL, "content" text NOT NULL, "price" real NOT NULL, "published" datetime NOT NULL ); CREATE INDEX "bboard_bb_published_58fde1b5" ON "bboard_bb" ("published"); COMMIT; Этот код был сгенерирован для СУБД SQLite (вспомним — проект Django по умолчанию использует базу данных именно этого формата). Если применяется другая СУБД, результирующий SQL-код будет соответственно отличаться. Налюбовавшись на нашу первую миграцию, выполним ее. Для этого наберем в командной строке команду: manage.py migrate ВНИМАНИЕ! Многие стандартные приложения, поставляющиеся в составе Django, хранят свои данные в базе и для создания всех необходимых таблиц включают в себя набор миграций. Команда migrate выполняет все миграции, входящие в состав всех приложений проекта и не выполнявшиеся ранее. Судя по выводящимся в командной строке сообщениям, таких миграций много — целых 19, включая созданную нами. Дождемся, когда их выполнение завершится, и продолжим. 1.9. Консоль Django Итак, у нас есть готовая модель для хранения объявлений. Но пока что нет ни одного объявления. Создадим парочку для целей отладки. Фреймворк включает в свой состав собственную редакцию интерактивного интерпретатора Python, называемую консолью Django. От аналогичной командной среды Python она отличается тем, что в ней в состав путей поиска модулей добавляется путь к папке проекта, в которой запущена эта консоль. В командной строке наберем команду для запуска консоли Django: manage.py shell И сразу увидим знакомое приглашение >>>, предлагающее нам ввести какое-либо выражение Python и получить результат его выполнения. 1.10. Работа с моделями Создадим первое объявление — первую запись модели Bb: >>> from bboard.models import Bb >>> b1 = Bb(title='Дача', content='Общество "Двухэтажники". ' + \ ... 'Два этажа, кирпич, свет, газ, канализация', price=500000)


Глава 1. Основные понятия Django. Вывод данных 41 Запись модели создается аналогично объекту любого другого класса — вызовом конструктора. Значения полей можно указать в именованных параметрах. Созданная таким образом запись модели не сохраняется в базе данных, а существует только в оперативной памяти. Чтобы сохранить ее, достаточно вызвать у нее метод save() без параметров: >>> b1.save() Проверим, сохранилось ли наше первое объявление, получив значение его ключевого поля: >>> b1.pk 1 Отлично! Сохранилось. Атрибут pk, поддерживаемый всеми моделями, хранит значение ключевого поля текущей записи. А это значение может быть получено только после сохранения записи в базе. Мы можем обратиться к любому полю записи, воспользовавшись соответствующим ему атрибутом объекта модели: >>> b1.title 'Дача' >>> b1.content 'Общество "Двухэтажники". Два этажа, кирпич, свет, газ, канализация' >>> b1.price 500000 >>> b1.published datetime.datetime(2022, 8, 24, 11, 33, 42, 700903, tzinfo=datatime.timezone.utc) >>> b1.id 1 В последнем случае мы обратились непосредственно к ключевому полю id. Создадим еще одно объявление: >>> b2 = Bb() >>> b2.title = 'Автомобиль' >>> b2.content = '"Жигули"' >>> b2.price = 1000000 >>> b2.save() >>> b2.pk 2 Да, можно поступить и так: создать «пустую» запись модели, записав вызов конструктора ее класса без параметров и занеся нужные значения в поля позже. Что-то во втором объявлении маловато информации о продаваемой машине... Давайте дополним ее:


42 Часть I. Вводный курс >>> b2.content = '"Жигули", 1980 года, ржавая, некрашеная, сильно битая' >>> b2.save() >>> b2.content '"Жигули", 1980 года, ржавая, некрашеная, сильно битая' >>> b2.price 1000000 Добавим еще одно объявление: >>> Bb.objects.create(title='Дом', content='Трехэтажный, кирпич', ... price=50000000) <Bb: Bb object (3)> Все классы моделей поддерживают атрибут класса objects. Он хранит диспетчер записей — объект, представляющий все имеющиеся в модели записи и созданный на основе класса Manager. Метод create() диспетчера записей создает новую запись модели, принимая в качестве набора именованных параметров значения ее полей, сразу же сохраняет ее и возвращает в качестве результата. Выведем ключи и заголовки всех объявлений, имеющихся в модели Bb: >>> for b in Bb.objects.all(): ... print(b.pk, ': ', b.title) ... 1 : Дача 2 : Автомобиль 3 : Дом Метод all() диспетчера записей возвращает набор записей — последовательность из всех записей модели, которую можно перебрать в цикле. Сам набор записей представляется объектом класса QuerySet, а отдельные записи — объектами соответствующего класса модели. Отсортируем записи модели по заголовку: >>> for b in Bb.objects.order_by('title'): ... print(b.pk, ': ', b.title) ... 2 : Автомобиль 1 : Дача 3 : Дом Метод order_by() диспетчера записей сортирует записи по значению поля, имя которого указано в параметре, и возвращает набор записей, в котором записи отсортированы по заданному полю. Извлечем объявления о продаже домов: >>> for b in Bb.objects.filter(title='Дом'): ... print(b.pk, ': ', b.title) ... 3 : Дом


Глава 1. Основные понятия Django. Вывод данных 43 Метод filter() диспетчера записей фильтрует записи по заданным критериям. В частности, чтобы получить только записи, у которых определенное поле содержит заданное значение, следует указать в вызове этого метода именованный параметр, чье имя совпадает с именем нужного поля, и присвоить ему требуемое значение. Метод возвращает набор записей, содержащий только отфильтрованные записи. Объявление о продаже автомобиля имеет ключ 2. Отыщем его: >>> b = Bb.objects.get(pk=2) >>> b.title 'Автомобиль' >>> b.content '"Жигули", 1980 года, ржавая, некрашеная, сильно битая' Метод get() диспетчера записей имеет то же назначение, что и метод filter(), и вызывается аналогичным образом. Однако он ищет не все подходящие записи, а лишь одну и возвращает ее в качестве результата. Давайте удалим это ржавое позорище: >>> b.delete() (1, {'bboard.Bb': 1}) Метод delete() модели, как уже понятно, удаляет текущую запись и возвращает сведения о количестве удаленных записей, обычно малополезные. Ладно, хватит пока! Выйдем из консоли Django, набрав команду exit(). И сделаем так, чтобы контроллер index() выводил список объявлений, отсортированный по убыванию даты их публикации. Откроем модуль views.py пакета приложения bboard и исправим хранящийся в нем код согласно листингу 1.8. Листинг 1.8. Код модуля views.py пакета приложения bboard from django.http import HttpResponse from .models import Bb def index(request): s = 'Объявления\r\n\r\n\r\n' for bb in Bb.objects.order_by('-published'): s += bb.title + '\r\n' + bb.content + '\r\n\r\n' return HttpResponse(s, content_type='text/plain; charset=utf-8') Чтобы отсортировать объявления по убыванию даты их публикации, мы в вызове метода order_by() диспетчера записей предварили имя поля published символом «минус». Список объявлений мы представили в виде обычного текста, разбитого на строки последовательностями символов \r\n.


44 Часть I. Вводный курс При создании объекта класса HttpResponse, представляющего серверный ответ, в именованном параметре content_type конструктора указали тип отправляемых данных: обычный текст, набранный в кодировке UTF-8 (если мы этого не сделаем, веб-обозреватель посчитает текст HTML-кодом и выведет его одной строкой, скорее всего, в нечитаемом виде). Сохраним исправленный модуль и запустим отладочный веб-сервер. На рис. 1.3 показан результат наших трудов. Теперь наш сайт стал больше похож на доску объявлений. Рис. 1.3. Вывод списка объявлений в виде обычного текста Точно так же можно сгенерировать полноценную веб-страницу. Но есть более простой способ — применение шаблонов. 1.11. Шаблоны Шаблон — это образец для генерирования веб-страницы, отправляемой клиенту в составе ответа. Генерированием страниц на основе шаблонов занимается подсистема Django, называемая шаблонизатором. Шаблон Django — это файл с HTML-кодом страницы, содержащий особые команды шаблонизатора: директивы, теги и фильтры. Директивы предписывает поместить в указанное место HTML-кода заданное значение, теги управляют генерированием содержимого, а фильтры выполняют какие-либо преобразования выводимого значения перед собственно выводом. По умолчанию шаблонизатор ищет все шаблоны в папках templates, вложенных в папки пакетов приложений (это поведение можно изменить, задав соответствующие настройки, о которых мы поговорим в главе 11). Сами файлы шаблонов вебстраниц должны иметь расширение html. Остановим отладочный сервер. Создадим в папке пакета приложения bboard папку templates, а в ней — вложенную папку bboard. Сохраним в этой папке наш первый шаблон index.html, код которого приведен в листинге 1.9.


Глава 1. Основные понятия Django. Вывод данных 45 Листинг 1.9. Код шаблона bboard\index.html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Главная :: Доска объявлений</title> </head> <body> <h1>Объявления</h1> {% for bb in bbs %} <div> <h2>{{ bb.title }}</h2> <p>{{ bb.content }}</p> <p>{{ bb.published|date:"d.m.Y H:i:s" }}</p> </div> {% endfor %} </body> </html> В целом здесь нам все знакомо. За исключением команд шаблонизатора. Давайте познакомимся с ними. Начнем вот с этого тега шаблонизатора: {% for bb in bbs %} . . . {% endfor %} Аналогично циклу for...in языка Python он перебирает последовательность, хранящуюся в переменной bbs (которая входит в состав контекста шаблона, о котором мы поговорим чуть позже), на каждом проходе цикла присваивая очередной элемент переменной bb, которая доступна в теле цикла. У нас переменная bbs станет хранить перечень объявлений, и, таким образом, переменной bb будет присваиваться очередное объявление. Директива шаблонизатора: {{ bb.title }} указывает извлечь значение из атрибута title объекта, хранящегося в переменной bb, и вставить это значение в то место кода, в котором находится она сама. И наконец, фильтр date: <p>{{ bb.published|date:"d.m.Y H:i:s" }}</p> преобразует значение из атрибута published объекта bb, т. е. временну´ю отметку публикации объявления, в формат, указанный в виде строки после двоеточия. Строка "d.m.Y H:i:s" задает формат <число>.<номер месяца>.<год из четырех цифр> <часы в 24-часовом формате>:<минуты>:<секунды>.


46 Часть I. Вводный курс 1.12. Контекст шаблона, рендеринг и сокращения Откроем модуль views.py пакета приложения bboard и внесем исправления в его код согласно листингу 1.10. Листинг 1.10. Код модуля views.py пакета приложения bboard (используются низкоуровневые инструменты) from django.http import HttpResponse from django.template import loader from .models import Bb def index(request): template = loader.get_template('bboard/index.html') bbs = Bb.objects.order_by('-published') context = {'bbs': bbs} return HttpResponse(template.render(context, request)) Сначала загружаем шаблон, воспользовавшись функцией get_template() из модуля django.template.loader. В качестве параметра указываем строку с путем к файлу шаблона от папки templates. Функция вернет объект класса Template, представляющий загруженный из заданного файла шаблон. Далее формируем контекст шаблона — набор данных, которые будут выведены на генерируемой странице. Контекст шаблона должен представлять собой обычный словарь Python, элементы которого преобразуются в доступные внутри шаблона переменные, одноименные ключам этих элементов. Так, элемент bbs создаваемого нами контекста шаблона, содержащий перечень объявлений, будет преобразован в переменную bbs, доступную в шаблоне. Наконец, выполняем рендеринг шаблона, т. е. генерирование на его основе вебстраницы. Для этого вызываем метод render() класса Template, передав ему подготовленный ранее контекст шаблона и объект класса HttpRequest, представляющий клиентский запрос и полученный контроллером-функцией через параметр request. Результат — строку с HTML-кодом готовой веб-страницы — передаем конструктору класса HttpResponse для формирования ответа. Сохраним оба исправленных файла, запустим отладочный веб-сервер и посмотрим на результат. Вот теперь это действительно веб-страница (рис. 1.4)! В коде контроллера index() (см. листинг 1.10) для рендеринга мы использовали низкоуровневые инструменты, несколько усложнив код. Но Django предоставляет средства более высокого уровня — функции-сокращения (shortcuts). Так, функциясокращение render() из модуля django.shortcuts выполняет и загрузку, и рендеринг шаблона. Попробуем ее в деле, исправив код модуля views.py, как показано в листинге 1.11.


Глава 1. Основные понятия Django. Вывод данных 47 Рис. 1.4. Веб-страница, сформированная с применением шаблона Листинг 1.11. Код модуля views.py пакета приложения bboard (используется функция-сокращение render()) from django.shortcuts import render from .models import Bb def index(request): bbs = Bb.objects.order_by('-published') return render(request, 'bboard/index.html', {'bbs': bbs}) Обновим веб-страницу со списком объявлений и убедимся, что этот код работает точно так же, как и написанный ранее, однако при этом имеет меньший объем. 1.13. Административный веб-сайт Django Все-таки два объявления — это слишком мало... Добавим еще несколько. Только сделаем это не в консоли Django, а на встроенном в этот фреймворк административном сайте. Административный веб-сайт1 предоставляет доступ ко всем моделям, объявленным во всех приложениях проекта, и позволяет просматривать, добавлять, править и удалять записи, фильтровать и сортировать их. Помимо этого, административный 1 Разработчики и администраторы сайтов обычно называют его админкой.


48 Часть I. Вводный курс сайт не пускает к данным сайта посторонних, используя для этого встроенную во фреймворк подсистему разграничения доступа. Эта подсистема реализована в стандартном приложении django.contrib.auth. А работу самого административного сайта обеспечивает стандартное приложение django.contrib.admin. Оба этих приложения изначально присутствуют в списке зарегистрированных в проекте. Стандартное приложение django.contrib.auth использует для хранения списков зарегистрированных пользователей, групп и их привилегий особые модели. Для них в базе данных должны быть созданы таблицы, и создание этих таблиц выполняют особые миграции. Следовательно, чтобы встроенные в Django средства разграничения доступа работали, нужно хотя бы один раз выполнить миграции (что мы уже сделали — в разд. 1.8). Еще нужно создать зарегистрированного пользователя сайта с максимальными правами — суперпользователя. Для этого остановим отладочный веб-сервер и отдадим в командной строке команду: manage.py createsuperuser Утилита manage.py запросит у нас имя создаваемого суперпользователя, его адрес электронной почты и пароль, который потребуется ввести дважды: Username (leave blank to use 'vlad'): admin Email address: [email protected] Password: Password (again): Пароль должен содержать не менее 8 символов, буквенных и цифровых, набранных в разных регистрах. Если пароль не удовлетворяет этим требованиям, утилита выдаст соответствующие предупреждения и спросит, создавать ли суперпользователя: This password is too short. It must contain at least 8 characters. This password is too common. This password is entirely numeric. Bypass password validation and create user anyway? [y/N]: y Для создания суперпользователя с неподходящим паролем в ответ на запрос следует ввести букву «y» и нажать <Enter>. Как только суперпользователь будет успешно создан, появится уведомление: Superuser created successfully. После этого русифицируем проект Django. Откроем модуль settings.py пакета конфигурации и найдем в нем вот такое выражение: LANGUAGE_CODE = 'en-us' Переменная LANGUAGE_CODE задает код языка по умолчанию. На нем будут выводиться системные сообщения и страницы административного сайта. Изначально это американский английский язык (код en-us). Исправим это выражение, занеся в него код русского языка, используемого в России: LANGUAGE_CODE = 'ru-ru'


Click to View FlipBook Version