Опубликовано

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

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

Описание

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

Электронное приложение-архив на сайте издательства содержит коды всех примеров.

Для веб-программистов

Python и Django — команда мечты!

Что такое веб-фреймворк?

Фреймворк (от англ. framework — каркас) — это программная библиотека, реализующая бОльшую часть типовой функциональности разрабатываемого продукта. То есть в полном смысле слова каркас, на который разработчик конкретного продукта «навешивает» свои узлы, механизмы и детали декора.
Веб-фреймворк — это фреймворк для программирования веб-сайтов. Как правило, он обеспечивает следующую типовую функциональность:

  • взаимодействие с базой данных — посредством единых инструментов, независимых от конкретной СУБД;
  • обработка клиентских запросов — в частности, определение, какая страница запрашивается;
  • генерирование запрашиваемых веб-страниц на основе шаблонов;
  • разграничение доступа — допуск к закрытым страницам только зарегистрированных пользователей и только после выполнения ими входа;
  • обработка данных, занесенных посетителями в веб-формы, — в частности, проверка их на корректность;
  • получение и сохранение файлов, выгруженных пользователями;
  • рассылка электронных писем;
  • кеширование сгенерированных страниц на стороне сервера — для повышения производительности;
  • локализация — перевод сайта на другие языки.

Внимание

Автор предполагает, что читатели этой книги знакомы с языками HTML, CSS, JavaScript, Python, принципами работы СУБД и имеют базовые навыки в веб-разработке. В книге все это описываться не будет.

Django — популярнейший в мире веб-фреймворк, написанный на языке Python, и один из наиболее распространенных веб-фреймворков в мире. Появившись в 2005 году — именно тогда вышла его первая версия, — он до сих пор остается «на коне».

Фреймвок получил название в честь французского джазового гитариста-виртуоза Джанго Рейнхардт (цыг. Django Reinhardt; настоящее имя Жан Ренарт, фр. Jean Reinhardt; 23 января 1910 — 16 мая 1953). Прозвище Рейнхардта «Django» на цыганском языке означает «я проснулся».

Книгу “Django 4. Практика создания веб-сайтов на Python” можно купить со скидкой в интернет-магазине издательства “БХВ“.

Предисловие…………………………………………………………………………………………… 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

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. Миграции……………………………………………………………………………….. 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

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

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

Глава 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

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

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

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

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

Глава 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

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

Глава 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

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

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

 

Дронов Владимир Александрович, профессиональный программист, писатель и журналист, работает с компьютерами с 1987 года. Автор более 30 популярных компьютерных книг, в том числе «Django 2.1. Практика создания веб-сайтов на Python», “HTML, JavaScript, PHP и MySQL. Джентльменский набор Web-мастера“, «Python 3. Самое необходимое», «Python 3 и PyQt 5. Разработка приложений», “Laravel. Быстрая разработка современных динамических Web-сайтов на PHP, MySQL, HTML и CSS“, “Angular 4. Быстрая разработка сверхдинамических Web-сайтов на TypeScript и PHP” и книг по продуктам Adobe Flash и Adobe Dreamweaver различных версий. Его статьи публикуются в журналах “Мир ПК” и “ИнтерФейс” (Израиль) и интернет-порталах “IZ City” и “TheVista.ru”.

Опубликовано

Новинка: Алгоритмический тренинг. Решения практических задач на Python и С++

Алгоритмический тренинг. Решения практических задач на Python и С++

Опираясь на богатый соревновательный и эвристический опыт, автор предлагает оригинальные реализации классических алгоритмов Computer Science на языках Python и C++. Особое внимание уделено математическим и геометрическим алгоритмам, графовым алгоритмам, структурам данных (в особенности различным деревьям), комбинаторике и работе со строками. Книга поможет заложить и расширить алгоритмическую подготовку, познакомит с эффективными решениями вычислительных задач, а для обучающихся станет настольной.  Поможет подготовиться к экзаменам, сертификации, олимпиадам по программированию.

Алгоритмы и структуры данных — основа профессиональной подготовки программиста. В библиотеке профессионала найдутся многотомные неустаревающие труды по этой теме. Но, чтобы выйти за рамки академической Computer Science и перейти к реальной практике, алгоритмы нужно быстро подбирать и применять. Автор этой книги работал над ней более 10 лет, опираясь на свой богатый опыт олимпиадного и спортивного программирования.

В книге собраны варианты реализации и применения важнейших алгоритмов в условиях быстрого принятия решений — что незаменимо на собеседованиях и конференциях. Также книга может быть полезна для подготовки к экзаменам, олимпиадам и соревнованиям по программированию. Но в большей степени она позиционируется как настольная книга для начинающих программистов, желающих быстро и интересно приобрести качественную алгоритмическую подготовку — и претендовать на достойное предложение о работе. Реализации всех алгоритмов даны на двух языках — Python и С++.

Книгу “Алгоритмический тренинг. Решения практических задач на Python и С++” можно купить со скидкой в интернет-магазине издательства “БХВ“.

Введение. 9

Глава 1. Для кого эта книга. 10

Глава 2. Чему обучит эта книга. 11

Глава 3. Спортивное и промышленное программирование. 12

Глава 4. Как пользоваться книгой. 14

Ступень I. Разминка. 15

Глава 5. Вводные задачи. 16

5.1. A+B. 16

5.2. Пример решения задачи. Числа Фибоначчи. 17

5.3. Пример решения задачи. Манхэттенское расстояние. 18

5.4. Пример решения задачи. Путь до ксерокса. 20

5.5. Пример решения задачи. Проверка перестановки. 22

5.6. Пример решения задачи. Циклы перестановки. 23

Глава 6. Разминочные конструктивные задачи. 25

6.1. Пример решения задачи. Пара с минимальным произведением. 25

6.2. Пример решения задачи. Тайная жизнь деревьев. 27

6.3. Пример решения задачи. Подписывание открыток. 28

6.4. Пример решения задачи. Исправление перестановки. 30

6.5. Пример решения задачи. Минимальный палиндром. 33

6.6. Пример решения задачи. Исключающее ИЛИ от 1 до n. 34

6.7. Пример решения задачи. Врачи и посетители. 37

6.8. Пример решения задачи. Минимизация перепадов. 40

6.9. Пример решения задачи. Одномерный геометрический центр. 42

Глава 7. Разминочные реализационные задачи. 45

7.1. Пример решения задачи. Морской бой. 45

7.2. Пример решения задачи. Стоимость интернет-связи. 47

7.3. Пример решения задачи. Пересечение двух прямоугольников. 50

7.4. Пример решения задачи. Проверка скобочной последовательности. 52

7.5. Пример решения задачи. Проверка скобочной последовательности
с двумя типами. 54

7.6. Пример решения задачи. Зеркальный лабиринт. 55

7.6. Пример решения задачи. Троичная сбалансированная система счисления. 58

Глава 8. Задачи для самостоятельного решения. 60

8.1. Примеры задач. 60

8.2. Задачи в онлайн-системах. 63

Итоги ступени I 64

Ступень II. Базовые алгоритмы.. 65

Глава 9. Оценка скорости работы алгоритмов. 66

9.1. Эмпирическая скорость процессора. 66

9.2. Асимптотическая оценка. Основы. 68

9.3. Практическая применимость асимптотических оценок. 75

9.4. Библиотечные реализации алгоритмов и их скорость. 76

Глава 10. Наибольший общий делитель. Алгоритм Евклида. 80

10.1. Постановка задачи. 80

10.2. Тривиальный алгоритм. 80

10.3. Алгоритм Евклида. 80

10.4. Доказательство алгоритма Евклида. 81

10.5. Реализация алгоритма Евклида. 81

10.6. Время работы алгоритма Евклида. 83

10.7. Пример решения задачи. Сокращение дроби. 84

10.8. Пример решения задачи. Наименьшее общее кратное. 84

10.9. Пример решения задачи. НОД нескольких чисел. 86

10.10. Пример решения задачи. Увеличение НОД массива. 87

10.11. Упражнения для самостоятельного решения. 88

Глава 11. Простые задачи на учет асимптотики. 91

11.1. Пример решения задачи. Префиксы перестановки. 91

11.2. Пример решения задачи. Парковочные места. 92

Глава 12. Объединение одномерных отрезков. 95

12.1. Постановка задачи. 95

12.2. Алгоритм объединения отрезков. 95

12.3. Реализация алгоритма объединения отрезков. 95

12.4. Пример решения задачи. Часы приема. 96

12.5. Пример решения задачи. Стрельба по отрезкам. 97

12.6. Пример решения задачи. Многослойная покраска. 99

Глава 13. Метод двух указателей. 102

13.1. Пример решения задачи. Пары фиксированной суммы. 102

13.2. Пример решения задачи. Длиннейший подотрезок без повторов. 104

13.3. Пример решения задачи. Подотрезки со всеми числами. 105

13.4. Пример решения задачи. Трехцветный забор. 107

Глава 14. Двоичный поиск. 110

14.1. Базовая задача: поиск в упорядоченном массиве. 110

14.2. Алгоритм двоичного поиска. 110

14.3. Реализация алгоритма двоичного поиска. 111

14.4. Библиотечные реализации. 112

14.5. Пример решения задачи. Подсчет меньших чисел. 112

14.6. Пример решения задачи. Грузовой лифт в отеле. 114

14.7. Пример решения задачи. Дисплеи для смартфонов. 116

14.8. Пример решения задачи. Прыжки лягушки. 118

14.9. Пример решения задачи. Корень уравнения. 120

14.10. Прочие применения двоичного поиска. 123

Глава 15. Проверка на простоту и факторизация. 124

15.1. Определения. 124

15.2. Общие сведения о простых числах и о факторизации. 124

15.3. Проверка числа на простоту. Базовый алгоритм. 125

15.4. Факторизация числа. Базовый алгоритм. 126

15.5. Пример решения задачи. Подсчет числа делителей. 127

15.6. Пример решения задачи. Иррациональный портной. 128

15.7. Пример решения задачи. Произведения-квадраты. 131

15.8. Пример решения задачи. Запросы числа делителей. 133

Глава 16. Динамическое программирование. Основы.. 136

16.1. Пример решения задачи. Сумма однообразных чисел. 136

16.2. Пример решения задачи. Наидлиннейшая возрастающая подпоследовательность. 138

16.3. Пример решения задачи. Подмножество с заданной суммой. 140

16.4. Пример решения задачи. Минимальное подмножество с заданной суммой. 143

16.5. Пример решения задачи. Получение суммы монетами заданных номиналов. 145

16.6. Пример решения задачи. Задача о рюкзаке. 146

16.7. Пример решения задачи. Кладоискатель. 148

16.8. Пример решения задачи. Путь в матрице. 151

16.9. Пример решения задачи. Расстояние редактирования. 153

Глава 17. Задачи для самостоятельного решения. 156

17.1. Примеры задач. 156

17.2. Задачи в онлайн-системах. 161

Итоги ступени II 163

Ступень III. Расширение базового арсенала. 163

Глава 18. Техники предварительного подсчета на массивах. 164

18.1. Указатели до ближайших элементов. 164

18.2. Частичные суммы. 165

18.3. Указатели до ближайших меньших элементов. 166

18.4. Списки позиций. 167

18.5. Сжатие значений. 168

18.6. Пример решения задачи. Поиск начала слова. 168

18.7. Пример решения задачи. Два подотрезка заданной длины с максимальной суммой. 170

18.8. Пример решения задачи. Подсчет чисел в подотрезках. 172

18.9. Пример решения задачи. Подотрезок с максимальной суммой. 175

18.10. Пример решения задачи. Проекционная реклама. 180

18.11. Пример решения задачи. Подотрезок с максимальным средним
арифметическим. 182

18.12. Пример решения задачи. Сумма в прямоугольнике. 186

Глава 19. Графы. Обход в глубину. 190

19.1. Что такое граф. 190

19.2. Ориентированные и неориентированные графы. 191

19.3. Способы представления графов в компьютере. 191

19.4. Алгоритм обхода в глубину. 198

19.5. Реализация обхода в глубину. 199

19.6. Пример решения задачи. Проверка наличия пути. 202

19.7. Пример решения задачи. Конная прогулка. 204

19.8. Пример решения задачи. Проверка связности. 207

19.9. Пример решения задачи. Проверка двудольного графа. 209

19.10. Пример решения задачи. Проверка орграфа на ацикличность. 213

19.11. Пример решения задачи. Топологическая сортировка. 218

19.12. Пример решения задачи. Диаметр дерева  221

Глава 20. Графы. Обход в ширину. 223

20.1. Алгоритм обхода в ширину. 223

20.2. Свойства обхода в ширину. 224

20.3. Реализация обхода в ширину. 225

20.4. Пример решения задачи. Кластер компьютеров. 228

20.5. Пример решения задачи. Робот в лабиринте. 230

20.6. Пример решения задачи. Наводнение. 234

Глава 21. Решето Эратосфена. 236

21.1. Алгоритм решета Эратосфена. 236

21.2. Демонстрация работы алгоритма. 236

21.3. Доказательство корректности решета Эратосфена. 237

21.4. Время работы решета Эратосфена. 237

21.5. Базовые оптимизации решета Эратосфена. 238

21.6. Реализация решета Эратосфена. 239

21.7. Дальнейшие оптимизации решета Эратосфена. 240

21.8. Пример решения задачи. Подсчет простых чисел в отрезке. 243

Глава 22. Двоичное возведение в степень. 246

22.1. Ключевая идея. 246

22.2. Алгоритм двоичного возведения в степень. 247

22.3. Иллюстрация работы алгоритма. 247

22.4. Время работы двоичного возведения в степень. 248

22.5. Реализация двоичного возведения в степень. 248

22.6. Пример решения задачи. Последние цифры степени. 249

22.7. Пример решения задачи. Обратное по простому модулю. Малая теорема Ферма. 251

22.8. Пример решения задачи. Быстрое вычисление чисел Фибоначчи.
Двоичное возведение матриц в степень. 252

22.9. Пример решения задачи. Физический движок. 255

22.10. Пример решения задачи. Подсчет путей фиксированной длины. 261

Глава 23. Структуры данных. Дерево отрезков. 265

23.1. Базовый вариант. Дерево для минимумов. 265

23.2. Дерево отрезков для максимумов. 272

23.3. Дерево отрезков с запросами модификации. 273

23.4. Дерево отрезков для сумм. 274

23.5. Прочие виды операций в дереве отрезков. 274

23.6. Запросы обновления на отрезке. 275

23.7. Дальнейшие обобщения дерева отрезков. 279

23.8. Пример решения задачи. Наидлиннейшая возрастающая
подпоследовательность (быстрый вариант) 280

23.9. Пример решения задачи. Наименьший общий предок. 281

Глава 24. Задачи для самостоятельного решения. 284

24.1. Примеры задач. 284

24.2. Задачи в онлайн-системах. 288

Ступень IV. Разносторонняя подготовка. 291

Глава 25. Производительность ввода-вывода. 292

25.1. Производительность ввода-вывода в Python. 292

25.2. Производительность ввода-вывода в C++. 294

Глава 26. Графы. Алгоритм Дейкстры.. 298

26.1. Постановка задачи поиска кратчайших путей. 298

26.2. Пример. 298

26.3. Алгоритм Дейкстры. 299

26.4. Ограничения алгоритма Дейкстры. 300

26.5. Пример работы алгоритма Дейкстры. 300

26.6. Восстановление кратчайшего пути. 302

26.7. Доказательство алгоритма Дейкстры. 303

26.8. Квадратичная реализация алгоритма Дейкстры. 304

26.9. Алгоритм Дейкстры для разреженных графов. 308

26.10. Пример решения задачи. Оптимальный путь четной длины. 312

26.11. Пример решения задачи. Ребра кратчайших путей. 315

Глава 27. Графы. Компоненты сильной связности. 318

27.1. Определения. 318

27.2. Алгоритм поиска компонент сильной связности. 320

27.3. Доказательство алгоритма. 320

27.4. Демонстрация работы алгоритма. 323

27.5. Временная сложность алгоритма. 324

27.6. Реализация алгоритма. 324

27.7. Дополнительные свойства алгоритма. 327

27.8. Пример решения задачи. Железнодорожный вокзал. 327

27.9. Пример решения задачи. Задача умозаключенного. 328

27.10. Пример решения задачи. Сбор дани. 329

Глава 28. Работа с вещественными числами. 335

28.1. Формат чисел с плавающей запятой. 335

28.2. Проблемы чисел с плавающей запятой. 337

28.3. Приемы работы с числами с плавающей запятой. 342

Глава 29. Геометрия на плоскости. Основы.. 346

29.1. Расстояние между точками. 346

29.2. Косое произведение векторов. 347

29.3. Скалярное произведение векторов. 348

29.4. Площадь треугольника. 349

29.5. Направление поворота. Ориентированная площадь треугольника. 350

29.6. Площадь многоугольника. 351

29.7. Проверка точки на принадлежность прямой. 353

29.8. Проверка точки на принадлежность отрезку. 353

29.9. Проверка двух отрезков на пересечение. 355

29.10. Расстояние от точки до прямой. 358

29.11. Расстояние от точки до отрезка. 359

29.12. Точка пересечения двух прямых. 362

29.13. Точка пересечения двух отрезков. 365

29.14. Матрица поворота. 368

29.15. Пример решения задачи. Проверка окружностей на пересечение. 369

29.16. Пример решения задачи. Пересечение окружности и прямой. 371

29.17. Пример решения задачи. Сортировка точек по углу. 375

Глава 30. Расширенный алгоритм Евклида. 380

30.1. Алгоритм. 380

30.2. Доказательство. 380

30.3. Реализация расширенного алгоритма Евклида. 381

30.4. Пример решения задачи. Прыжки вперед и назад. 382

30.5. Пример решения задачи. Линейное диофантово уравнение с двумя переменными. 384

30.6. Пример решения задачи. Обратное по составному модулю.. 386

Глава 31. Задачи для самостоятельного решения. 389

31.1. Примеры задач. 389

Заключение. 395

Методики решения задач. 396

Благодарности. 397

Послесловие. 398

Приложение. Решения задач. 399

Задачи из главы 8. 399

Задачи из главы 10. 401

Задачи из главы 17. 402

Задачи из главы 24. 406

Задачи из главы 31. 411

Предметный указатель. 415

Максим-Иванов

Максим Иванов профессионально занимается системным программированием, долгое время увлекается изучением Windows API, подробно исследовал ядро Windows. Несколько лет участвовал в олимпиадах по программированию, серебряный призёр чемпионата мира 2011 г. в составе команды Саратовского государственного университета. Автор сайта об алгоритмах https://e-maxx.ru, на основе которого написана эта книга.

Опубликовано

Представляем новинку: “Надежный Python”

Надежный Python

Современные проекты на языке Python непрерывно растут, развиваются и при этом неизбежно усложняются. Добиться надежности кода Python при сохранении гибкости, понятности и расширяемости приложений позволяет система типов, которая в данной книге подробно исследована в рамках парадигмы ООП. Особое внимание уделяется аннотированию и проверке типов, а также созданию пользовательских специализированных типов.  Продвинутые главы книги посвящены вопросам тестирования, линтинга и обеспечения надежности программ на Python.

Для программистов

Пишем чистый код, который удобно поддерживать

Вам кажется, что ваши проекты Python становятся все больше и больше? Вас охватывает паника по мере того, как ваш программный код расширяется и его становится все труднее отлаживать и поддерживать? Python — это простой язык для изучения и использования, но это также означает, что системы могут быстро выйти за пределы понимания разработчика. К счастью, в Python есть функции, помогающие разработчикам преодолеть проблемы с ремонтопригодностью.

Прочитав книгу Вы:

  • узнаете, как максимально использовать систему типов Python;
  • познакомитесь с определяемыми пользователем типами, такими как классы и перечисления, а также с системой подсказок типов Python;
  • научитесь использовать в качестве подстраховки комплексную стратегию тестирования;
  • узнаете, как сделать Python расширяемым.

С помощью этих советов и приемов вы сможете писать более понятный и удобный для сопровождения код.

Книга идеально подходит для

  • разработчиков, которые в настоящее время работают с большой кодовой базой и пытаются найти более эффективные способы взаимодействия со своими коллегами;
  • специалистов по первоначальному сопровождению программного кода, которые ищут способы уменьшить нагрузку при сопровождении в будущем;
  • самоучек, которые хорошо владеют языком программирования Python, но хотят лучше понимать, почему и что мы делаем;
  • начинающих специалистов в области информационных технологий, которым нужны практические советы по разработке;
  • опытных разработчиков, которые ищут способ, как обосновать свой дизайн, опираясь на основные принципы надежности.

Моя книга сосредоточена на том, чтобы разработчики, унаследовавшие ваш код, не вносили новых ошибок в вашу систему. Я покажу вам, как общаться с будущими разработчиками, как упростить им работу с помощью архитектурных шаблонов и как выявлять ошибки в кодовой базе до того, как они попадут в готовый продукт. Основное внимание в книге уделяется надежности вашей кодовой базы на Python, а не надежности вашей системы в целом.
Патрик Виафоре

Патрик Виафоре

Патрик Виафоре более 13 лет занимался разработкой ПО повышенной надежности, в том числе для обнаружения молний, решения телекоммуникационных задач. Участвовал в разработке операционных систем. В настоящее время руководит собственной компанией Kudzera, LLC, занимающейся консалтингом и заказными проектами, связанными с Ubuntu. Свою миссию видит в демократизации высококачественной программной инженерии на благо профессионального сообщества.

Книгу “Надежный Python” можно купить со скидкой в интернет-магазине издательства “БХВ“.

Введение………………………………………………………………………………………………… 11

Для кого предназначена книга?……………………………………………………………………………………………….. 12

О чем эта книга?…………………………………………………………………………………………………………………………. 13

Условные обозначения……………………………………………………………………………………………………………… 15

Использование примеров кода…………………………………………………………………………………………………. 15

Как с нами связаться………………………………………………………………………………………………………………….. 16

Благодарности…………………………………………………………………………………………………………………………… 16

Глава 1. Введение в надежный Python……………………………………………………. 19

Надежность кодовой базы………………………………………………………………………………………………………… 19

Почему важна надежность?…………………………………………………………………………………………… 22

Обмен полезной информацией………………………………………………………………………………………………….. 23

Асинхронное взаимодействие……………………………………………………………………………………….. 26

Примеры понятного кода на Python…………………………………………………………………………………………. 29

Коллекции……………………………………………………………………………………………………………………….. 29

Итерации…………………………………………………………………………………………………………………………. 32

Принцип наименьшего удивления…………………………………………………………………………………. 34

Резюме…………………………………………………………………………………………………………………………………………. 35

Часть I. Аннотации типов…………………………………………………………… 37

Глава 2. Введение в типы Python……………………………………………………………. 39

Что такое тип?……………………………………………………………………………………………………………………………. 39

Машинное представление……………………………………………………………………………………………… 39

Семантическое представление……………………………………………………………………………………… 41

Системы типов……………………………………………………………………………………………………………………………. 44

Сильная и слабая типизации…………………………………………………………………………………………. 44

Динамическая и статическая типизации………………………………………………………………………. 45

Неявная (утиная) типизация………………………………………………………………………………………….. 46

Резюме…………………………………………………………………………………………………………………………………………. 48

Глава 3. Аннотации типов……………………………………………………………………… 49

Что такое аннотации типов?…………………………………………………………………………………………………….. 49

Использование аннотаций типов……………………………………………………………………………………………… 53

Автодополнение……………………………………………………………………………………………………………… 53

Проверка типов……………………………………………………………………………………………………………….. 53

Примеры найденных ошибок………………………………………………………………………………………… 55

Когда добавлять аннотации типа…………………………………………………………………………………………….. 57

Резюме…………………………………………………………………………………………………………………………………………. 57

Глава 4. Ограничивающие типы……………………………………………………………. 59

Аннотация Optional…………………………………………………………………………………………………………………… 59

Аннотация Union……………………………………………………………………………………………………………………….. 65

Тип-произведение и тип-сумма……………………………………………………………………………………… 67

Аннотация Literal………………………………………………………………………………………………………………………. 69

Аннотация Annotated…………………………………………………………………………………………………………………. 70

Аннотация NewType…………………………………………………………………………………………………………………… 70

Аннотация Final…………………………………………………………………………………………………………………………. 73

Резюме…………………………………………………………………………………………………………………………………………. 74

Глава 5. Коллекции……………………………………………………………………………….. 75

Аннотирование коллекций………………………………………………………………………………………………………… 75

Однородные и разнородные коллекции…………………………………………………………………………………… 76

Аннотация TypedDict…………………………………………………………………………………………………………………. 80

Создание новых типов коллекций……………………………………………………………………………………………. 82

Дженерики……………………………………………………………………………………………………………………….. 83

Изменение существующих типов………………………………………………………………………………….. 85

Так же просто, как ABC…………………………………………………………………………………………………. 88

Резюме…………………………………………………………………………………………………………………………………………. 90

Глава 6. Настройка проверки типов………………………………………………………. 91

Инструмент проверки типов mypy…………………………………………………………………………………………… 91

Параметры конфигурации……………………………………………………………………………………………… 92

Поиск динамической типизации……………………………………………………………………………. 93

Нетипизированные функции…………………………………………………………………………………. 94

Отслеживание None/Optional………………………………………………………………………………… 94

Отчеты mypy…………………………………………………………………………………………………………………… 95

Ускорение mypy……………………………………………………………………………………………………………… 96

Другие инструменты проверки типов………………………………………………………………………………………. 97

Pyre…………………………………………………………………………………………………………………………………… 97

Запросы к кодовой базе…………………………………………………………………………………………. 98

Pysa………………………………………………………………………………………………………………………… 100

Pyright…………………………………………………………………………………………………………………………….. 103

Резюме………………………………………………………………………………………………………………………………………. 105

Глава 7. Внедрение проверки типов……………………………………………………… 106

Поиск компромиссов……………………………………………………………………………………………………………….. 107

Быстрое получение выгоды……………………………………………………………………………………………………. 108

Поиск слабых мест……………………………………………………………………………………………………….. 108

Стратегические фрагменты кода………………………………………………………………………………… 109

Аннотирование только нового кода…………………………………………………………………… 109

Аннотирование снизу вверх………………………………………………………………………………… 109

Аннотирование основной бизнес-логики…………………………………………………………… 110

Аннотирование часто меняющегося кода………………………………………………………….. 110

Аннотирование сложного кода…………………………………………………………………………… 110

Использование инструментов……………………………………………………………………………………… 110

MonkeyType………………………………………………………………………………………………………….. 112

Pytype…………………………………………………………………………………………………………………….. 116

Резюме………………………………………………………………………………………………………………………………………. 117

Часть II. Определение ваших собственных типов…………. 119

Глава 8. Пользовательские типы: перечисления………………………………….. 121

Пользовательские типы…………………………………………………………………………………………………………… 121

Перечисления…………………………………………………………………………………………………………………………… 122

Тип Enum……………………………………………………………………………………………………………………….. 124

Когда не надо их использовать…………………………………………………………………………………… 125

Дополнительные возможности……………………………………………………………………………………………….. 126

Автоматические значения……………………………………………………………………………………………. 126

Тип Flag…………………………………………………………………………………………………………………………. 127

Целочисленные перечисления…………………………………………………………………………………….. 129

Уникальные значения…………………………………………………………………………………………………… 130

Резюме………………………………………………………………………………………………………………………………………. 131

Глава 9. Пользовательские типы: классы данных……………………………….. 132

Примеры классов данных……………………………………………………………………………………………………….. 132

Использование классов данных……………………………………………………………………………………………… 136

Строковые представления…………………………………………………………………………………………… 136

Равенство………………………………………………………………………………………………………………………. 137

Реляционное сравнение……………………………………………………………………………………………….. 138

Неизменяемость……………………………………………………………………………………………………………. 139

Сравнение с другими типами………………………………………………………………………………………………….. 141

Классы данных и словари…………………………………………………………………………………………… 141

Классы данных и TypedDict………………………………………………………………………………………… 142

Классы данных и namedtuple………………………………………………………………………………………. 142

Резюме………………………………………………………………………………………………………………………………………. 143

Глава 10. Пользовательские типы: классы…………………………………………… 144

Строение класса………………………………………………………………………………………………………………………. 144

Конструктор………………………………………………………………………………………………………………….. 145

Инварианты……………………………………………………………………………………………………………………………… 146

Нарушение инвариантов……………………………………………………………………………………………… 148

Зачем нужны инварианты……………………………………………………………………………………………. 149

Информативные инварианты………………………………………………………………………………………. 151

Для пользователей класса…………………………………………………………………………………… 152

При сопровождении кода…………………………………………………………………………………….. 153

Инкапсуляция и поддержка инвариантов……………………………………………………………………………… 155

Инкапсуляция……………………………………………………………………………………………………………….. 155

Доступ к данным…………………………………………………………………………………………………………… 155

Работа с данными…………………………………………………………………………………………………………. 158

Резюме………………………………………………………………………………………………………………………………………. 160

Глава 11. Определение своих интерфейсов…………………………………………… 162

Проектирование естественного интерфейса…………………………………………………………………………. 163

Думай как пользователь………………………………………………………………………………………………. 164

Разработка через тестирование………………………………………………………………………….. 164

Разработка через README…………………………………………………………………………………. 165

Юзабилити-тестирование……………………………………………………………………………………. 166

Естественные взаимодействия………………………………………………………………………………………………… 167

Естественные интерфейсы в действии………………………………………………………………………… 167

Магические методы……………………………………………………………………………………………………… 173

Контекстные менеджеры……………………………………………………………………………………………… 175

Резюме………………………………………………………………………………………………………………………………………. 177

Глава 12. Создание подтипов……………………………………………………………….. 178

Наследование…………………………………………………………………………………………………………………………… 178

Взаимозаменяемость……………………………………………………………………………………………………………….. 183

Рекомендации по проектированию………………………………………………………………………………………… 188

Композиция…………………………………………………………………………………………………………………… 189

Резюме………………………………………………………………………………………………………………………………………. 191

Глава 13. Протоколы……………………………………………………………………………. 193

Структурная и номинальная типизации………………………………………………………………………………… 193

Пустой тип и Any…………………………………………………………………………………………………………… 195

Использование Union…………………………………………………………………………………………………… 195

Использование наследования……………………………………………………………………………………… 196

Использование миксинов……………………………………………………………………………………………… 197

Протоколы………………………………………………………………………………………………………………………………… 198

Создание протокола…………………………………………………………………………………………………….. 199

Расширенное использование………………………………………………………………………………………………….. 200

Составные протоколы………………………………………………………………………………………………….. 200

Протоколы времени выполнения………………………………………………………………………………… 201

Протоколы для модулей………………………………………………………………………………………………. 202

Резюме………………………………………………………………………………………………………………………………………. 203

Глава 14. Проверки во время выполнения с помощью pydantic……………. 204

Динамическая конфигурация………………………………………………………………………………………………….. 204

Библиотека pydantic………………………………………………………………………………………………………………… 210

Валидаторы………………………………………………………………………………………………………………….. 212

Валидация и парсинг……………………………………………………………………………………………………. 215

Резюме………………………………………………………………………………………………………………………………………. 216

Часть III. Расширяемый код……………………………………………………… 219

Глава 15. Расширяемость……………………………………………………………………… 221

Что такое расширяемость?……………………………………………………………………………………………………… 221

Реструктуризация кода………………………………………………………………………………………………… 223

Принцип открытости/закрытости…………………………………………………………………………………………… 227

Поиск нарушений принципа………………………………………………………………………………………… 228

Недостатки OCP……………………………………………………………………………………………………………. 229

Резюме………………………………………………………………………………………………………………………………………. 230

Глава 16. Зависимости…………………………………………………………………………. 231

Взаимосвязи……………………………………………………………………………………………………………………………… 232

Типы зависимостей………………………………………………………………………………………………………………….. 234

Физические зависимости……………………………………………………………………………………………… 234

Логические зависимости………………………………………………………………………………………………. 238

Временные зависимости………………………………………………………………………………………………. 240

Визуализация зависимостей…………………………………………………………………………………………………… 241

Визуализация пакетов………………………………………………………………………………………………….. 242

Визуализация импорта………………………………………………………………………………………………… 243

Визуализация вызовов функций………………………………………………………………………………….. 243

Интерпретация графа зависимостей…………………………………………………………………………… 245

Резюме………………………………………………………………………………………………………………………………………. 246

Глава 17. Компонуемость…………………………………………………………………….. 248

Что такое компонуемость?……………………………………………………………………………………………………… 248

Разделение политик и механизмов…………………………………………………………………………………………. 252

Компонуемость в меньшем масштабе……………………………………………………………………………………. 255

Компонуемые функции………………………………………………………………………………………………… 255

Декораторы…………………………………………………………………………………………………………… 256

Компонуемые алгоритмы…………………………………………………………………………………………….. 259

Резюме………………………………………………………………………………………………………………………………………. 262

Глава 18. Событийно-ориентированная архитектура…………………………… 263

Как это работает……………………………………………………………………………………………………………………… 263

Недостатки……………………………………………………………………………………………………………………. 264

Простые события……………………………………………………………………………………………………………………… 266

Использование брокера сообщений……………………………………………………………………………. 266

Шаблон наблюдателя………………………………………………………………………………………………….. 268

Поток событий…………………………………………………………………………………………………………………………. 270

Резюме………………………………………………………………………………………………………………………………………. 273

Глава 19. Подключаемый код………………………………………………………………. 274

Шаблонный метод…………………………………………………………………………………………………………………… 275

Шаблон стратегии…………………………………………………………………………………………………………………… 278

Архитектура плагинов…………………………………………………………………………………………………………….. 279

Резюме………………………………………………………………………………………………………………………………………. 283

Часть IV. Ваша страховочная сетка……………………………………… 285

Глава 20. Статический анализ……………………………………………………………… 287

Линтинг…………………………………………………………………………………………………………………………………….. 287

Написание собственного плагина для Pylint……………………………………………………………… 289

Разбор плагина……………………………………………………………………………………………………………… 291

Другие статические анализаторы………………………………………………………………………………………….. 293

Проверки сложности…………………………………………………………………………………………………….. 294

Цикломатическая сложность Маккейба…………………………………………………………….. 294

Проверка отступов……………………………………………………………………………………………….. 296

Анализ безопасности……………………………………………………………………………………………………. 297

Утечка секретных данных…………………………………………………………………………………… 297

Проверка уязвимостей…………………………………………………………………………………………. 297

Резюме………………………………………………………………………………………………………………………………………. 298

Глава 21. Стратегия тестирования……………………………………………………….. 299

Определение вашей стратегии тестирования……………………………………………………………………….. 299

Что такое тесты?…………………………………………………………………………………………………………… 300

Пирамида тестирования………………………………………………………………………………………. 302

Снижение стоимости тестирования……………………………………………………………………………………….. 304

AAA-тестирование……………………………………………………………………………………………………….. 304

Arrange (настройка предусловий)……………………………………………………………………….. 305

Annihilate (очистка ресурсов)……………………………………………………………………………… 308

Act (действие)……………………………………………………………………………………………………….. 310

Assert (утверждение)…………………………………………………………………………………………….. 311

Резюме………………………………………………………………………………………………………………………………………. 314

Глава 22. Приемочное тестирование…………………………………………………….. 315

Разработка через поведение (BDD)………………………………………………………………………………………… 316

Язык Gherkin………………………………………………………………………………………………………………….. 316

Исполняемые спецификации……………………………………………………………………………………….. 318

Дополнительные возможности behave…………………………………………………………………………………… 321

Параметризованные шаги……………………………………………………………………………………………. 321

Требования, составленные в виде таблиц………………………………………………………………….. 321

Регулярные выражения………………………………………………………………………………………………… 322

Настройка жизненного цикла теста……………………………………………………………………………. 322

Использование тегов для выборочного запуска тестов……………………………………………. 323

Генерация отчетов……………………………………………………………………………………………………….. 323

Резюме………………………………………………………………………………………………………………………………………. 325

Глава 23. Тестирование на основе свойств…………………………………………… 326

Тестирование с помощью Hypothesis…………………………………………………………………………………….. 326

Магия Hypothesis………………………………………………………………………………………………………….. 330

Отличия от традиционных тестов………………………………………………………………………………. 331

Дополнительные возможности Hypothesis……………………………………………………………………………. 332

Стратегии Hypothesis…………………………………………………………………………………………………… 332

Генерирование алгоритмов…………………………………………………………………………………………. 333

Резюме………………………………………………………………………………………………………………………………………. 337

Глава 24. Мутационное тестирование………………………………………………….. 338

Что такое мутационное тестирование?…………………………………………………………………………………. 338

Использование mutmut…………………………………………………………………………………………………………….. 341

Исправление мутантов…………………………………………………………………………………………………. 343

Отчеты о тестировании………………………………………………………………………………………………… 343

Внедрение мутационного тестирования……………………………………………………………………………….. 344

Проблема с показателем покрытия (и другими метриками)…………………………………….. 346

Резюме………………………………………………………………………………………………………………………………………. 347