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

Книга ориентирована на читателей, имеющих базовый опыт программирования на языке Python и желающих быстро научиться применять его в реальных проектах или изучить Python в качестве второго языка. Рассмотрен широкий круг тем от соблюдения чистоты кода и грамотного именования функций и переменных, до проектирования API, правил объектно-ориентированного программирования, обеспечения безопасности (аутентификация, авторизация) и взаимодействия с базами данных. Затронут широкий круг вопросов, связанных с программированием модулей на Python, автоматизацией задач, использования веб-фреймворков, в частности Flask.

Discover the best professional documents and content resources in AnyFlip Document Base.
Search
Published by BHV.RU Publishing House, 2024-01-21 00:21:21

Python. Как стать профессионалом

Книга ориентирована на читателей, имеющих базовый опыт программирования на языке Python и желающих быстро научиться применять его в реальных проектах или изучить Python в качестве второго языка. Рассмотрен широкий круг тем от соблюдения чистоты кода и грамотного именования функций и переменных, до проектирования API, правил объектно-ориентированного программирования, обеспечения безопасности (аутентификация, авторизация) и взаимодействия с базами данных. Затронут широкий круг вопросов, связанных с программированием модулей на Python, автоматизацией задач, использования веб-фреймворков, в частности Flask.

Keywords: Flask,Python

Санкт-Петербург «БХВ-Петербург» 2024


УДК 004.43 ББК 32.973.26-018.1 Ф25 Фаррелл Д. Ф25 Python. Как стать профессионалом: Пер. с англ. — СПб.: БХВ-Петербург, 2024. — 352 с.: ил. ISBN 978-5-9775-1944-1 Книга ориентирована на читателей, имеющих базовый опыт программирования на языке Python и желающих быстро научиться применять его в реальных проектах или изучить Python в качестве второго языка. Рассмотрен широкий круг тем от соблюдения чистоты кода и грамотного именования функций и переменных, до проектирования API, правил объектно-ориентированного программирования, обеспечения безопасности (аутентификация, авторизация) и взаимодействия с базами данных. Затронут широкий круг вопросов, связанных с программированием модулей на Python, автоматизацией задач, использования веб-фреймворков, в частности Flask. Для программистов на Python УДК 004.43 ББК 32.973.26-018.1 Группа подготовки издания: Руководитель проекта Олег Сивченко Зав. редакцией Людмила Гауль Перевод с английского Николая Вильчинского Редактор Анна Кузьмина Компьютерная верстка Натальи Смирновой Корректор Филипп Бастиан Оформление обложки Зои Канторович © 2024 BHV Authorized translation of the English edition © 2023 Manning Publications. This translation is published and sold by permission of Manning Publications, the owner of all rights to publish and sell the same. Авторизованный перевод с английского языка на русский издания © 2023 Manning Publications. Перевод опубликован и продается с разрешения компании-правообладателя Manning Publications. Все права защищены. "БХВ-Петербург", 191036, Санкт-Петербург, Гончарная ул., 20. ISBN 978-1-61729-744-1 (англ.) ISBN 978-5-9775-1944-1 (рус.) © Manning Publications, 2023 © Перевод на русский язык, оформление. ООО "БХВ-Петербург", ООО "БХВ", 2024


СОДЕРЖАНИЕ Предисловие ......................................................................................................................... 13 Введение ................................................................................................................................ 15 Благодарности...................................................................................................................... 17 Об этой книге ....................................................................................................................... 19 Для кого предназначена данная книга............................................................................. 19 Структура книги: ее дорожная карта............................................................................... 20 О коде ................................................................................................................................. 22 Об авторе............................................................................................................................... 23 Глава 1. Становление питониста...................................................................................... 25 1.1. Стремление к обучению ............................................................................................ 26 1.2. Достижение целей ...................................................................................................... 27 1.2.1. Стиль мышления разработчика.......................................................................... 27 1.2.2. Создание приложений......................................................................................... 28 1.3. Использование языка Python..................................................................................... 28 1.3.1. Парадигмы программирования.......................................................................... 28 1.3.2. Создание сопровождаемого кода....................................................................... 29 1.3.3. Производительность ........................................................................................... 30 1.3.4. Сообщество приверженцев языка...................................................................... 32 1.3.5. Инструментарий разработчика .......................................................................... 33 1.4. Выбор используемой версии Python......................................................................... 34 1.5. Заключительные размышления................................................................................. 35 1.6. Резюме ......................................................................................................................... 35 ЧАСТЬ I. ЗАКЛАДКА ФУНДАМЕНТА ..................................................................................... 37 Глава 2. Подходящие имена .............................................................................................. 39 2.1. Имена........................................................................................................................... 39 2.1.1. Присвоение имен................................................................................................. 41 2.1.2. Эксперимент по присвоению имен.................................................................... 44 2.2. Пространства имен..................................................................................................... 46


6 Содержание 2.3. Пространства имен в языке Python........................................................................... 47 2.3.1. Уровень встроенных модулей............................................................................ 48 2.3.2. Уровень модуля................................................................................................... 49 2.3.3. Уровень функций ................................................................................................ 53 2.3.4. Область видимости пространства имен ............................................................ 54 2.3.5. Эксперимент с пространством имен ................................................................. 56 2.4. Резюме ......................................................................................................................... 60 Глава 3. API: давайте пообщаемся................................................................................... 61 3.1. Начало разговора........................................................................................................ 62 3.1.1. Соглашение, заключаемое между частями кода .............................................. 63 3.1.2. Что передается в качестве входных данных..................................................... 64 3.1.3. Что ожидается на выходе ................................................................................... 66 3.2. Работа API................................................................................................................... 69 3.2.1. Именование.......................................................................................................... 69 3.2.2. Параметры............................................................................................................ 70 3.2.3. Возвращаемое значение...................................................................................... 73 3.2.4. Единственная ответственность .......................................................................... 73 3.2.5. Длина функции.................................................................................................... 74 3.2.6. Идемпотентность................................................................................................. 75 3.2.7. Побочные эффекты ............................................................................................. 75 3.3. Документация ............................................................................................................. 77 3.4. Заключительные размышления................................................................................. 78 3.5. Резюме ......................................................................................................................... 78 Глава 4. Объект разговора................................................................................................. 80 4.1. Объектно-ориентированное программирование ..................................................... 80 4.1.1. Определение класса ............................................................................................ 81 4.1.2. Рисование с помощью класса............................................................................. 83 4.1.3. Наследование....................................................................................................... 94 4.1.4. Полиморфизм .................................................................................................... 102 4.1.5. Композиция........................................................................................................ 103 4.2. Заключительные размышления............................................................................... 107 4.3. Резюме ....................................................................................................................... 107 Глава 5. Исключительные события............................................................................... 109 5.1. Исключения .............................................................................................................. 111 5.2. Обработка исключений............................................................................................ 113 5.2.1. Обработка исключения, если код способен как-то исправить ситуацию .... 114 5.2.2. Предоставление исключениям возможности перемещаться вверх по коду ваших программ ............................................................................................ 114 5.2.3. Информирование пользователя ....................................................................... 115 5.2.4. Не стоит замалчивать исключения .................................................................. 115 5.3. Выдача исключений................................................................................................. 120 5.4. Создание пользовательских исключений............................................................... 121 5.5. Заключительные размышления............................................................................... 124 5.6. Резюме ....................................................................................................................... 124


Содержание 7 ЧАСТЬ II. РАБОТА НАД КОНКРЕТНЫМ ЗАДАНИЕМ........................................................... 125 Глава 6. Обмен информацией по Интернету................................................................ 127 6.1. Делитесь своей работой с другими......................................................................... 127 6.1.1. Преимущества веб-приложений ...................................................................... 128 6.1.2. Сложности, связанные с использованием веб-приложений.......................... 128 6.2. Серверы..................................................................................................................... 129 6.2.1. Модель "запрос — ответ" ................................................................................. 130 6.3. Веб-серверы .............................................................................................................. 131 6.4. Flask ........................................................................................................................... 134 6.4.1. Почему именно Flask? ...................................................................................... 134 6.4.2. Ваш первый веб-сервер .................................................................................... 135 6.4.3. Обслуживание содержимого............................................................................ 138 6.4.4. Дополнительные функции Jinja2 ..................................................................... 141 6.5. Запуск веб-сервера ................................................................................................... 153 6.5.1. Gunicorn.............................................................................................................. 154 6.5.2. Коммерческий хостинг ..................................................................................... 154 6.6. Заключительные размышления............................................................................... 155 6.7. Резюме ....................................................................................................................... 155 Глава 7. Работа со стилем ................................................................................................ 157 7.1. Стилизация приложения.......................................................................................... 157 7.1.1. Создание привлекательных стилей ................................................................. 158 7.1.2. Согласованность стилей ................................................................................... 158 7.1.3. Нормализация стилей ....................................................................................... 159 7.1.4. Адаптивный дизайн .......................................................................................... 159 7.2. Встраивание Bootstrap.............................................................................................. 160 7.2.1. Предыдущий пример, теперь с Bootstrap ........................................................ 160 7.3. Помощь в развитии приложения MyBlog .............................................................. 169 7.3.1. Экземпляр приложения Flask........................................................................... 169 7.4. Пространства имен................................................................................................... 174 7.4.1. Flask Blueprints .................................................................................................. 174 7.4.2. Добавление Blueprints в MyBlog...................................................................... 175 7.4.3. Создание страницы "О сайте" .......................................................................... 179 7.4.4. Реструктуризированный app-экземпляр.......................................................... 181 7.5. Навигация.................................................................................................................. 181 7.5.1. Создание навигационной информации ........................................................... 182 7.5.2. Отображение навигационной информации .................................................... 183 7.5.3. Текущий вид MyBlog........................................................................................ 184 7.6. Конфигурация приложения ..................................................................................... 186 7.6.1. Файлы конфигурации ....................................................................................... 186 7.6.2. Закрытая информация....................................................................................... 186 7.7. Панель инструментов отладки Flask....................................................................... 187 7.7.1. FlaskDynaConf ................................................................................................... 187 7.8. Регистрационная информация................................................................................. 192 7.8.1. Конфигурация.................................................................................................... 192


8 Содержание 7.9. Добавление фавикона............................................................................................... 196 7.10. Заключительные размышления............................................................................. 198 7.11. Резюме ..................................................................................................................... 198 Глава 8. А я тебя знаю? Аутентификация .................................................................... 200 8.1. Протокол HTTP, не имеющий состояния............................................................... 200 8.1.1. Сессии ................................................................................................................ 201 8.2. Запоминание пользователя...................................................................................... 202 8.2.1. Аутентификация................................................................................................ 203 8.2.2. Вход в систему .................................................................................................. 213 8.3. Экстренные сообщения............................................................................................ 219 8.3.1. Усовершенствование формы входа ................................................................. 220 8.4. Расширение круга друзей ........................................................................................ 223 8.4.1. Blueprint-схема аутентификации ..................................................................... 224 8.4.2. Новая форма для пользователя ........................................................................ 225 8.4.3. Ах да: выход из системы .................................................................................. 228 8.5. Что дальше ................................................................................................................ 229 8.6. Резюме ....................................................................................................................... 229 Глава 9. Какие действия вам разрешены? Авторизация........................................... 230 9.1. Переход ко входу и выходу..................................................................................... 230 9.2. Подтверждение новых друзей................................................................................. 232 9.2.1. Отправка электронной почты........................................................................... 233 9.3. Сброс паролей........................................................................................................... 239 9.4. Профили пользователей........................................................................................... 243 9.5. Безопасность ............................................................................................................. 246 9.5.1. Защита маршрутов ............................................................................................ 246 9.6. Роли пользователей, задаваемые авторизацией..................................................... 247 9.6.1. Создание ролей.................................................................................................. 247 9.6.2. Авторизация маршрутов................................................................................... 250 9.7. Защита форм ............................................................................................................. 253 9.8. Заключительные размышления............................................................................... 253 9.9. Резюме ....................................................................................................................... 254 Глава 10. Выгоды от постоянства: базы данных......................................................... 255 10.1. Вторая половина дела ............................................................................................ 255 10.1.1. Долговременное хранение информации ....................................................... 256 10.2. Доступ к данным .................................................................................................... 256 10.3. Системы управления базами данных.................................................................... 262 10.3.1. Таблицы............................................................................................................ 262 10.3.2. Отношения ....................................................................................................... 263 10.3.3. База данных транзакций ................................................................................. 266 10.3.4. Язык структурированных запросов SQL ...................................................... 268 10.4. Использование SQLite в качестве базы данных .................................................. 271 10.5. SQLAlchemy............................................................................................................ 271 10.5.1. Преимущества ................................................................................................. 272


Содержание 9 10.6. Моделирование базы данных ................................................................................ 272 10.6.1. Определение классов ...................................................................................... 273 10.7. Создание и использование базы данных.............................................................. 277 10.7.1. Добавление данных......................................................................................... 277 10.7.2. Использование данных ................................................................................... 280 10.8. Заключительные размышления............................................................................. 283 10.9. Резюме ..................................................................................................................... 283 Глава 11. Мне есть что сказать....................................................................................... 285 11.1. Публикации в MyBlog............................................................................................ 285 11.1.1. Моделирование баз данных............................................................................ 286 11.2. Изменение порядка изложения материала........................................................... 289 11.3. Blueprint-схема контента ....................................................................................... 289 11.4. Отображение и создание публикаций .................................................................. 290 11.4.1. Обработчик отображения ............................................................................... 290 11.4.2. Шаблон отображения...................................................................................... 291 11.5. Создание публикаций ............................................................................................ 292 11.5.1. Обработчик создания ...................................................................................... 292 11.5.2. Форма создания ............................................................................................... 293 11.5.3. Шаблон создания............................................................................................. 294 11.6. Отображение и редактирование публикации ...................................................... 295 11.6.1. Обработчик отображения ............................................................................... 295 11.6.2. Шаблон отображения...................................................................................... 296 11.6.3. Обработчик обновления ................................................................................. 298 11.6.4. Форма обновления .......................................................................................... 299 11.6.5. Шаблон обновления........................................................................................ 300 11.7. Иерархия контента для комментариев ................................................................. 301 11.7.1. Изменение класса сообщения ........................................................................ 304 11.7.2. Обработчик отображения ............................................................................... 305 11.7.3. Шаблон отображения...................................................................................... 308 11.8. Создание комментариев......................................................................................... 310 11.8.1. Шаблон создания............................................................................................. 310 11.8.2. Форма создания ............................................................................................... 311 11.8.3. Обработчик создания ...................................................................................... 311 11.9. Уведомление пользователей.................................................................................. 312 11.10. Обработка ошибок сайта ..................................................................................... 314 11.11. Заключительные размышления........................................................................... 317 11.12. Резюме ................................................................................................................... 317 Глава 12. И что, на этом всё?........................................................................................... 319 12.1. Тестирование .......................................................................................................... 319 12.1.1. Модульное тестирование................................................................................ 320 12.1.2. Функциональное тестирование...................................................................... 321 12.1.3. Сквозное тестирование ................................................................................... 321 12.1.4. Интеграционное тестирование....................................................................... 321 12.1.5. Нагрузочное тестирование ............................................................................. 321 12.1.6. Тестирование производительности ............................................................... 321


10 Содержание 12.1.7. Регрессионное тестирование.......................................................................... 322 12.1.8. Тестирование доступности............................................................................. 322 12.1.9. Приемочное тестирование.............................................................................. 322 12.2. Отладка.................................................................................................................... 323 12.2.1. Воспроизведение ошибок............................................................................... 323 12.2.2. Точки останова ................................................................................................ 323 12.2.3. Ведение журнала ............................................................................................. 324 12.2.4. Неприемлемые результаты............................................................................. 324 12.2.5. Процесс исключения....................................................................................... 325 12.2.6. Проговаривание проблемы............................................................................. 325 12.3. Инструменты........................................................................................................... 325 12.3.1. Управление исходным кодом......................................................................... 325 12.3.2. Оптимизация.................................................................................................... 326 12.3.3. Контейнеры...................................................................................................... 327 12.3.4. Базы данных..................................................................................................... 327 12.3.5. Языки................................................................................................................ 328 12.4. Среды операционных систем ................................................................................ 329 12.5. Облачные вычисления ........................................................................................... 329 12.6. Сеть.......................................................................................................................... 330 12.7. Сотрудничество ...................................................................................................... 330 12.8. Заключительные размышления............................................................................. 331 12.9. Резюме ..................................................................................................................... 331 Приложение. Ваша среда разработки............................................................................ 333 П1. Установка Python...................................................................................................... 333 П1.1. Windows.............................................................................................................. 334 П1.2. Mac...................................................................................................................... 334 П1.3. Linux ................................................................................................................... 335 П2. Виртуальная среда Python........................................................................................ 336 П2.1. Windows.............................................................................................................. 337 П2.2. Mac и Linux ........................................................................................................ 338 П3. Настройка Visual Studio Code.................................................................................. 339 П3.1. Установка Visual Studio Code........................................................................... 339 П3.2. Установка Python-расширения......................................................................... 340 П3.3. Другие полезные расширения .......................................................................... 340 П3.4. Запуск из командной строки ............................................................................ 341 П3.5. Запуск проекта................................................................................................... 341 П4. Ряд полезных советов............................................................................................... 343 Предметный указатель..................................................................................................... 345


Эта книга посвящена моему партнеру и жене Сьюзен, чьи поддержка, терпение и любовь делают все невозможное возможным


ПРЕДИСЛОВИЕ Все современные творения корифеев-разработчиков программных средств неизменно вызывают наше неподдельное восхищение. Чего только стоят яркие и неизгладимые впечатления от Instagram1 , а взять YouTube, этот видеохостинг затмевает даже самую большую телевизионную аудиторию, и все равно создается впечатление, что вы единственный пользователь в системе. В основе YouTube и Instagram лежит Python. В самом начале занятий программированием стоящие перед вами задачи представляются в виде трудного восхождения на вершину. К счастью, вам совсем не обязательно взбираться на гору с наскока, равно как не обязательно сразу становиться амбициозным разработчиком Python. Разработка программных средств не требует от автора быть гением. Не нужно также обладать ярким математическим талантом. Для того чтобы стать хорошим разработчиком программных средств, требуются крайняя любознательность и исключительная настойчивость. Вам не обязательно верить мне на слово. Гвидо ван Россум (Guido van Rossum), изобретатель Python, дал интервью для подкаста Sing for Science: Ведущий. А что, математические наклонности иметь не обязательно? Гвидо. Да, это так. Гораздо важнее математики наличие склонности к логическому мышлению и внимания к деталям. Итак, если программирование не сводится к чистой математике, то что же тогда нужно для успеха? Нужны тысячи мелких и понятных строительных блоков. Сродни восхождению на гору, требующему множества мелких шагов и большого упорства, создание YouTube сопряжено с решением тысяч небольших и не требующих особых пояснений компьютерных задач, решаемых с помощью всего лишь нескольких строк понятного всем кода. Так как же найти эти строительные блоки? Можно бродить по Интернету и обучающим средствам по программированию, собирая их вместе, или же, как при занятиях альпинизмом, можно нанять гида. И теперь вашими путеводителями могут стать Дуг Фаррелл (Doug Farrell) и эта его книга. Здесь вам предстоит изучение множества строительных блоков. Вы поймете, как важно четко давать всем вещам четкие названия. Неужели будет непонятно, что функция, названная get_blog_post_by_id, не нуждается в дополнительных поясне- 1 Признана экстремистской организацией и запрещена в РФ. — Примеч. ред.


14 Предисловие ниях? Вы поймете, как можно будет сгруппировать код в повторно используемые блоки функций. С помощью Python и Flask вы будете создавать формы для отображения в Интернете. Вы воспользуетесь имеющимся в Python пакетом для работы с базами данных под названием SQLAlchemy, предназначенным для чтения и записи информации, хранящейся в базе данных, и не требующим освоения SQL (языка для работы с реляционными базами данных). В конечном счете будет получено вполне пригодное к применению настоящее приложение, построенное из всего предлагаемого вам множества строительных блоков. Его создание станет увлекательным путешествием, а код приложения — отличным ресурсом, из которого можно будет извлекать примеры и идеи по мере вашего карьерного роста в качестве разработчика программных средств. Руководствуясь тем, что автор изложил в данной книге, вы продолжите свое восхождение к вершине мастерства и не успеете оглянуться, как уже окажетесь на вершине. Майкл Кеннеди (Michael Kennedy) — приверженец Python и предприниматель. Ведущий подкастов Talk Python To Me и Python Bytes. Основатель Talk Python Training и научный сотрудник Python Software Foundation в Портленде, штат Орегон


ВВЕДЕНИЕ За свою жизнь мне пришлось трудиться на многих интересных и разнообразных работах и посчастливилось быть разработчиком программных средств на протяжении почти 40 лет. За это время мне довелось изучить и включить в свой рабочий весьма широкий круг языков программирования — Pascal, Fortran, C, C++, Visual Basic, PHP, Python и JavaScript — и применить разработки на этих языках во многих отраслях. Использование всех перечисленных выше языков и опыт работы с ними меня многому научили. Язык C научил меня использовать указатели (и, конечно же, злоупотреблять ими), зародив во мне желание оптимизировать создаваемые приложения для повышения скорости их работы. C++ научил меня объектно-ориентированному программированию (ООП) — образу мышления, которого я строго придерживаюсь до сих пор. PHP был моим первым знакомством с языком сценариев, и он научил меня тому, что, возможно, не стоит самостоятельно управлять абсолютно всем, например памятью. PHP также посодействовал моему первому погружению в веб-разработку и зарождению идеи использования браузеров в качестве платформ для приложений. Прошло почти два десятилетия с тех пор, как я открыл для себя язык Python, и с того момента он стал моим самым любимым средством разработки приложений. Этот язык помог кристаллизоваться моим тогда еще не вполне сформировавшимся размышлениям о развитии программирования, идее о том, что должен быть один вполне очевидный способ решения тех или иных задач. Особую ценность приобрела возможность использования в рамках одного языка сразу нескольких концепций разработки: объектно-ориентированного, а также процедурного и функционального программирования. Язык может быть относительно простым в изучении и весьма выразительным, но при этом, по-видимому, не иметь ограничений по типам решаемых с его помощью задач. Поскольку я пребывал в полном восторге от Python, мне захотелось продвигать его в кругу своих коллег и поощрять их присоединение к его приверженцам. Это побудило меня проводить презентации и вести занятия в тех организациях, где я работал. У меня также была возможность преподавать Python детям в возрасте от 8 до 16 лет в центре STEM недалеко от моего родного города. Картину того, как именно проходили эти занятия, описать довольно сложно, поскольку я и сам многому научился у своих малолетних учеников. На каждом занятии совершенствовались мои навыки доступного преподнесения учебного материала. Срабатывали мои приемы обучения или нет, можно было понять по тому, насколько усердно


16 Введение мне приходилось работать, чтобы дети не переключались на своих ноутбуках на игру в Minecraft. Для проведения презентаций и занятий в классе я собирал собственный материал по Python. Мне захотелось расширить свой вклад в популяризацию языка, что привело к написанию статей для RealPython.com, благосклонно принятых аудиторией, что меня порадовало. Благодаря этим статьям я вышел на издательство Manning. Со мной связался рецензент издательства, который завел речь о написании для них книги по Python и о том, как она должна будет выглядеть. Результатом этих бесед стала данная книга, которая поможет вам стать разработчиком программных средств. Python — замечательный, выразительный и приятный инструмент, который, несомненно, достоин освоения. Я уже давно наслаждаюсь этим процессом и продолжаю наслаждаться им до сих пор. На продвижение этого языка и нацелена моя книга, и я надеюсь, что она поможет и вам достичь ваших целей.


БЛАГОДАРНОСТИ Мне пришлось приложить немало усилий для того, чтобы сделать эту книгу информативной и одновременно приятной для чтения. И если что-то из этого вышло, то все это благодаря людям, которые внесли свой вклад в ее создание. В создании данной книги мне помогали многие сотрудники Manning Publishing. Рецензент, который обратился ко мне с просьбой написать книгу, сотрудники производственных отделов, которые помогли ее сформировать, рецензенты, которые помогли ее улучшить, и мои редакторы разработки, помогавшие мне на каждом этапе пути. Все они помогли мне разобраться во многих аспектах написания и публикации книги, и я получил массу удовольствия от многочисленных бесед с ними, которые способствовали тому, чтобы я не сбился с пути на протяжении всего процесса создания книги. Я благодарен всем рецензентам, чьи предложения помогли повысить качество данной книги. Среди них: Алехандро Герра Мансанарес (Alejandro Guerra Manzanares), Аманда Деблер (Amanda Debler), Анджело Коста (Angelo Costa), Бернард Фуэнтес (Bernard Fuentes), Бхагван Коммади (Bhagvan Kommadi), Брэндон Фрайар (Brandon Friar), Чад Миарс (Chad Miars), Кристофер Карделл (Christopher Kardell), Дэн Шейх (Dan Sheikh), Данило Абриньяни (Danilo Abrignani), Дешуанг Танг (Deshuang Tang), Дхинакаран Венкат (Dhinakaran Venkat), Дирк Гомес (Dirk Gomez), Эдер Андрес Авила Ниньо (Eder Andres Avila Niño), Эли Майост (Eli Mayost), Эрик Чанг (Eric Chiang), Эрнест Аддае (Ernest Addae), Эвиатар Кафкафи (Evyatar Kafkafi), Эзра Шредер (Ezra Schroeder), Феликс Морено (Félix Moreno), Франциско Ривас (Francisco Rivas), Фрэнки Томас-Хоккей (Frankie Thomas-Hockey), Ганеш Сваминатан (Ganesh Swaminathan), Гарри Алан Оффорд (Garry Alan Offord), Густаво Гомес (Gustavo Gomes), Хироюки Муша (Hiroyuki Musha), Джеймс Дж. Байлекки (James J. Byleckie), Джеймс Мэтлок (James Matlock), Джанит Кумар Анджариа (Janit Kumar Anjaria), Хоакин Бельтран (Joaquin Beltran), Джон Гатри (John Guthrie), Джон Харбин (John Harbin), Джонни Хопкинс (Johnny Hopkins), Хосе Апаблаза (Jose Apablaza), Джозеф Пачод (Joseph Pachod), Джошуа А. Макадамс (Joshua A. McAdams), Жюльен Пои (Julien Pohie), Камеш Ганесан (Kamesh Ganesan), Катя Паткин (Katia Patkin), Кит Энтони (Keith Anthony), Клум Прабат Сенанаяке (Kelum Prabath Senanayake), Кимберли Уинстон-Джексон (Kimberly Winston-Jackson), Кошик Викрам (Koushik Vikram), Куп Сивам (Kup Sivam), Ли Хардинг (Lee Harding), Леонардо Таккари (Leonardo Taccari), Лев Вейде (Lev Veyde), Лукас Мейер (Lúcás Meier), Марк-Энтони Тейлор (Marc-Anthony Taylor), Марко Карнини (Marco Carnini), Маркус Гезель (Marcus Geselle), Мария Ана (Maria Ana), Майкл Патин (Michael


18 Благодарности Patin), Майк Бэран (Mike Baran), Мохана Кришна (Mohana Krishna), Мухаммад Сохаиб Ариф (Muhammad Sohaib Arif), НавинКумар Намачиваям (NaveenKumar Namachivayam), Нинослав Черкез (Ninoslav Cerkez), Патрик Риган (Patrick Regan), Филип Бест (Philip Best), Филип Паттерсон (Philip Patterson), Рахул Сингх (Rahul Singh), Рауль Мурсиано (Raul Murciano), Рэймонд Чунг (Raymond Cheung), Ричард Мейнсен (Richard Meinsen), Роберт Кулаговски (Robert Kulagowski), Родни Вайс (Rodney Weis), Роман Жужа (Roman Zhuzha), Ромелль Ян Де Ла Круз (Romell Ian De La Cruz), Самвид Мистри (Samvid Mistry), Сандип Дхамеджа (Sandeep Dhameja), Санджив Киларапу (Sanjeev Kilarapu), Сатедж Кумар Саху (Satej Kumar Sahu), Серджиу Радуку (Sergiu Raducu), Шанкар Свами (Shankar Swamy), Стэнли Анози (Stanley Anozie), Стефан Туральски (Stefan Turalski), Тедди Хагос (Teddy Hagos), Видья Винай (Vidhya Vinay) и Витош Дойнов (Vitosh Doynov). Также хочу поблагодарить Саманту Стоун (Samantha Stone), молодого редактора, которого я знаю лишь виртуально. С ней меня познакомил Пол Чайка (Paul Chayka), исполнительный директор Robotics & Beyond, местного образовательного центра STEM. Саманта занималась в гимназии R&B и вызвалась рецензировать книгу на этапе ее разработки. Она показала выдающиеся редакционные навыки, ее отзывы отличались простотой и бескомпромиссностью, а также были хорошим показателем того, что мне удалось, а что не очень в плане ясности изложения материала. Я также хотел бы поблагодарить Кармине Мауриелло (Carmine Mauriello). Мы с ним дружим на протяжении нескольких десятков лет и периодически бывали коллегами в одних и тех же организациях. Он мне с самого начала твердил: "Тебе следует написать книгу". До сих пор неясно, хотел ли он тем самым заставить меня замолчать, но, как бы ни было, Карм, я все равно ценю твою поддержку. Вот, наконец-то, эта книга и увидела свет. Хочу поблагодарить моих маму и папу, которые воистину были великими писателями. Мама поощряла (читай — выкручивала мне руки) мой поход на курсы машинописи во времена пишущих машинок IBM Selectric. И это оказалось одним из лучших когда-либо приобретенных мною навыков. Отец был великолепным рассказчиком и привил мне осознание важности написания простых повествовательных предложений. Он также был самым шустрым из когда-либо встречавшихся мне наборщиков текста на древней механической пишущей машинке "Андервуд". И наконец, я хотел бы поблагодарить мою жену Сьюзен, чья постоянная поддержка, ангельское терпение и, прежде всего, любовь сделали все это возможным.


ОБ ЭТОЙ КНИГЕ Книга "Python. Новое поколение разработки" призвана помочь начинающим программистам стать настоящими разработчиками. Сделать это предполагается двумя способами: представлением подходов к осмыслению процесса разработки применительно ко все более крупным проектам и демонстрацией того, как это делается с помощью Python. Для кого предназначена данная книга Книга не является учебником по основам языка Python, с этим вполне достойно справляются многие другие информационные ресурсы. Предполагается, что у читателя уже имеется некоторый опыт работы с Python и есть намерение и дальше развивать навыки владения этим языком. Если это все про вас, то полагаю, что моя книга может вам многое предложить. Одна из целей ее написания — помочь вам стать истинным питонистом. Так кто же с учетом этого является предполагаемым читателем данной книги? Я думаю, что существует довольно широкий круг читателей, которым будет полезен представленный здесь материал. К читателям первого типа можно отнести тех, кому известны основы программирования на Python: они знают, как для выполнения тех или иных задач писать циклы и условные инструкции, а также использовать переменные. У них уже есть опыт написания служебных программ, существующих в одном файле, и они умеют запускать их из командной строки. У них может возникнуть желание создавать более сложные приложения, но пока что отсутствует понимание того, как это можно сделать. Они могли бы замахнуться на создание веб-сервера с использованием Python и на освоение необходимых приемов программирования. По сути, у читателей данного типа имеется базовый набор инструментов, и он нацелился на создание чегото более значительного. К читателям второго типа можно отнести разработчиков, владеющих каким-либо другим языком и заинтересованных в расширении своего набора навыков за счет включения в него языка Python. Это может быть связано с растущей популярностью Python как с точки зрения практического использования, так и с точки зрения интереса к этому языку, или же это может быть связано с необходимостью его применения к проекту, разрабатываемому в их ведомстве. Они знают, как выполнять задачи на том языке, который используется в данный момент, и хотят научиться выполнять аналогичную работу с Python, становясь питонистами.


20 Об этой книге К читателям третьего типа можно отнести кого-то, кто занимается наукой о данных и аналитикой больших объемов данных. Python становится одним из ключевых игроков в этой области, и потребности в работах такого рода удовлетворяются многими достаточно хорошо развитыми библиотеками. Использования подобных библиотек в данной книге не будет, это тема для другой, узкоспециализированной книги, но читатели, вовлеченные в данную сферу, могут извлечь пользу и из нашего издания. Далеко не все работающие в области науки о данных являются разработчиками программных средств. Программирование — всего лишь средство достижения цели, инструмент, помогающий ее достичь. Приобретение навыков использования этого инструмента с большей отдачей и выразительностью в процессе обучения разработке программных средств на языке Python позволит вывести программирование из круга первостепенных проблем, предоставив больше возможностей сосредоточиться на самой сути поставленной задачи. Структура книги: ее дорожная карта В книге имеются две части: "Закладка фундамента" и "Работа над конкретным заданием". В части I собрана вся фундаментальная информация о процессе разработки и образе мышления при работе с языком Python. А часть II берет все это за основу для создания сложного веб-приложения. В каждой из частей имеется несколько глав. Закладка фундамента. – Глава 1 "Становление питониста" знакомит с концепциями мышления разработчика и достижения целей как таковых. В ней также представлен Python как не только вполне реальный, но и весьма эффективный путь для достижения поставленных целей. – Глава 2 "Подходящие имена" рассказывает о важности названий, используемых разработчиками, и о том, насколько эффективна концепция пространств имен. – Глава 3 "API: давайте пообщаемся" посвящена рассмотрению способов общения разработчиков и компьютеров: соглашениям, заключаемым между ними, и тому, что передается в качестве входных данных и что ожидается в качестве выходных данных. Кроме этого, в главе весьма подробно рассматриваются вопросы проектирования и реализации высококачественных функций на языке Python. – Глава 4 "Объект разговора" знакомит с объектно-ориентированным программированием (ООП) на языке Python. Сюда входит определение классов и использование наследования, полиморфизма и композиции при реализации иерархии классов. – Глава 5 "Исключительные события" посвящена исключениям в Python и способам их обработки: когда и где следует перехватывать исключения, а также как можно с ними справиться, если разработчик не планировал их перехват. В ней также говорится о преднамеренной выдаче исключений и создании пользовательских исключений.


Об этой книге 21 Работа над конкретным заданием. – Глава 6 "Обмен информацией по Интернету" посвящена началу создания демонстрационного веб-приложения, объединяющего в себе основы работы с языком, заложенные в предыдущих главах. – Глава 7 "Работа со стилем" устанавливает базовый уровень стиля демонстрационного веб-приложения путем введения в использование среды Bootstrap. В главе рассматриваются этапы, которые необходимо пройти для реализации и поддержки более крупного приложения с использованием Flask-приложения со схемами Blueprints, а также способы навигации по страницам приложения и его настройки. – Глава 8 "А я тебя знаю? Аутентификация" представляет методы аутентификации пользователей приложения. – Глава 9 "Какие действия вам разрешены? Авторизация" представляет авторизацию пользователей и виды авторизации, которые открывают пользователям те или иные возможности. В ней также рассматриваются отправка электронных писем из приложения и повышение безопасности аутентификации, используемой также для защиты отдельных частей приложения. – Глава 10 "Выгоды от постоянства: базы данных" является своего рода вспомогательной главой, поскольку в ней обсуждаются реляционные базы данных и способы их проектирования, реализации и обращения к ним. В главе также представляется библиотека SQLAlchemy — инструмент доступа к информации базы данных с использованием объектов Python. – Глава 11 "Мне есть что сказать" завершает работу над демонстрационным веб-приложением по созданию полноценной платформы для ведения блогов, где пользователи могут просматривать и создавать контент, а также оставлять на его счет собственные комментарии. – Глава 12 "И что, на этом все?" — последняя глава книги, где подводятся итоги тому, что узнали пользователи, и выражаются надежды на дальнейшее обучение, которое их ожидает. Приложение "Ваша среда разработки" содержит сведения об установке Python на различных платформах, о том, как настраивать виртуальные среды и почему это хорошая идея. Здесь также рассматривается установка Visual Studio Code в качестве интегрированной среды разработки (integrated development environment, IDE), помогающей создавать код Python. От вашего местонахождения на маршруте нашего путешествия по Python будет зависеть то, с чего начнется ваше изучение данной книги и что станет для вас наиболее ценной информацией. Если вы находитесь в начале пути, будет полезно прочитать всю книгу. Если же вы продвинулись чуть дальше, можно будет начать со второй части книги "Работа над конкретными заданием" и продолжить чтение с этого места.


22 Об этой книге О коде В книгу включены примеры исходного кода из сопровождающего ее репозитория GitHub, как в виде полных отдельно взятых листингов, так и в изложении в основной части текста. Код отформатирован моноширинным шрифтом, чтобы он отличался от остального материала книги. Часть кода для привлечения внимания выделена жирным шрифтом1 . Обычно такое выделение сопровождается поясняющей аннотацией. Листинги программного кода, представленные в книге, были переформатированы с учетом ограничений разметки книжных страниц. Кроме того, во многих случаях комментарии к коду, являющиеся частью репозитория, были удалены с целью экономии вертикального пространства на странице и уменьшения визуального захламления. Исполняемые фрагменты кода можно найти в онлайн-версии данной книги для liveBook по адресу https://livebook.manning.com/book/the-well-grounded-pythondeveloper. Полный исходный код для всех примеров, приводимых в книге, доступен на GitHub-сайте автора по адресу https://github.com/writeson/the-wellgrounded-python-developer и на веб-сайте издательства Manning по адресу https://www.manning.com/books/the-well-grounded-python-developer. 1 Также полужирным моноширинным шрифтом выделен текст, который пользователь вводит с клавиатуры в интерактивном режиме работы программ. — Примеч. ред.


ОБ АВТОРЕ Дуг Фаррелл (Doug Farrell) занимается разработкой программных средств с 1983 года, хотя имеет степени бакалавра по двум явно смежным областям — по физике и по прикладному искусству. Дуг — программист-самоучка, на протяжении многих лет использовавший немало языков во многих отраслях: Pascal, Fortran, C/C++, PHP, Python и JavaScript. С Python он работает с 2000 года, а с 2006 года Python стал его основным языком. Дуг написал множество статей для RealPython.com. Он также преподавал в центре STEM, где использовалась существенная часть материалов разработанного им обучающего курса.


1 СТАНОВЛЕНИЕ ПИТОНИСТА Темы главы В чем разница между программистом и разработчиком. Знакомство с сообществом Python. Выбор версии Python для проработки материалов книги. Профессию разработчика обычной не назовешь. Ее представители заняты тем, что создают нечто из ничего, и результаты их труда сложно поддаются описанию. Приходилось ли вам объяснять в простой компании, на что похоже создание программного кода? Даже превосходный рассказчик, способный завладеть вниманием слушателей, вряд ли получит от них какую-либо реакцию, свидетельствующую о понимании сути повествования. И это не вина слушателей. Ведь донести до них суть профессии разработчика действительно трудно. Чем программисты отличаются от разработчиков Возможно, интересно будет узнать, чем же разработчики отличаются от программистов. Программисты создают рабочие сценарии на языке Python. Разработчики создают модули, из которых собираются более крупные приложения. Программисты достаточно хорошо знают Python, что позволяет им создавать небольшие приложения. А разработчики знают Python в той мере, которая позволяет им использовать его в качестве одного из множества инструментов для создания более крупных приложений. Программисты решают задачи с применением языка Python, а разработчики продумывают общую концепцию приложения и то, как Python вписывается в их представление. Программисты знают порядок использования стандартной библиотеки Python, а разработчики знают, как можно применить пакеты сторонних производителей. Программисты пишут работоспособный код. Разработчики пишут постоянно сопровождаемый код.


26 Глава 1 Программисты могут не знать стандартов оформления кода, а разработчики для ускорения своей работы полагаются на соглашения и наработанные стили. Программисты сознают необходимость обучения. Разработчики считают накопление навыков делом всей своей жизни. Компьютеры — устройства сугубо статичные. А разработка приложений позволяет людям выразить желаемые со стороны компьютера действия на языке, доступном им для чтения и записи и понятном компьютеру. И тут важно выражаться достаточно точно, чтобы заставить компьютер делать задуманное, а не что-то другое. Люди в своем мире могут работать и достигать великих результатов, поскольку способны преуспевать в условиях отсутствия четкой определенности в человеческом общении. Смысл ими извлекается из контекста, намерения, интонации и прочих нюансов, т. е. из всего, чем богато наше общение. Но к компьютеру все это не применимо. Для его функционирования требуется почти запредельная точность. Внимание к мелочам при выражении этой точности, терпение в ее достижении, а также способность к обучению и восприимчивость к новым идеям являются неотъемлемой частью повседневной деятельности разработчика. Цель книги — заложить фундамент навыков и способов применения инструментов, составляющих полезный арсенал разработчиков. Инструменты будут использоваться для создания автономных приложений, способных продемонстрировать их возможности. Как только расширится ваш инструментальный арсенал, будет создано простое вебприложение, позволяющее освоиться с решением поставленных в нем задач, а затем оно будет изменено с целью включения новых функций. Каждый шаг будет опираться на приобретенные знания для освоения новой одной или нескольких способностей, приемов, модулей и решений. Python способен перенести вас в удивительный мир. Нужно только сделать первые шаги. Вот с этой мыслью давайте и начнем наш путь. 1.1. Стремление к обучению Успешное изучение приемов наилучшего усвоения технологий и разработки программных средств на языке Python является весьма ценным навыком. Стремление разработчика Python к самосовершенствованию дает ему два преимущества. Первое заключается в возможности браться за более крупные проекты с полной уверенностью в возможности их завершения и создания работоспособной системы. А второе — в выработке навыков обучения. Быть пожизненным учеником — это не просто броское наставление, это реальность повседневной деятельности разработчика программных средств. Мне за всю карьеру разработчика приходилось программировать на нескольких языках — Fortran, Pascal, C/C++, PHP, а теперь еще и на Python и JavaScript. Мне пришлось выучить некоторые из этих языков, поскольку они использовались там,


Становление питониста 27 где я работал. В иных случаях язык хорошо подходил для решения поставленной задачи. Когда-то я считал себя сильным программистом на C/C++, и мне нравилось работать над создаваемыми на этих языках приложениями. Но мне уже неинтересно освежать свои навыки работы с C/C++ и вновь заниматься такого рода программированием. В данный момент я считаю, что в качестве рабочего языка для меня лучше Python ничего не существует. Это сообразуется с моим желанием работать в объектно-ориентированном стиле программирования, но при этом не ограничиваться лишь его использованием. Синтаксис и грамматика Python достаточно понятны и выразительны, чтобы можно было обдумывать решения в псевдокоде, очень напоминающем код Python. Те, кто считают разработку программных средств своим призванием или желанием, должны иметь в виду, что карьера — это долгий путь с постоянно происходящими изменениями. Движение к реализации обеих целей невозможно без стремления к изучению новых технологий и языков. В современном изменчивом мире крайне мало гарантий найти достойное приложение своих сил, и единственным реальным залогом успеха могут стать приобретенные навыки и способность их применения на практике. 1.2. Достижение целей В книге преследуется несколько целей, и одна из них — помочь читателям стать более квалифицированными разработчиками, что, собственно, и подразумевается в ее названии. Если читаете эту книгу, значит, вы тоже задались этой целью. 1.2.1. Стиль мышления разработчика Изучение языка программирования предполагает освоение синтаксиса и грамматики этого языка: как создаются переменные, циклы, принимаются решения и выполняются инструкции программы. Все это станет базовыми инструментами, но стиль мышления разработчика предполагает освоение приемов их использования в сочетании друг с другом с целью создания полезной программы. Можно провести еще более глубокую аналогию, приводящую к созданию более крупных и эффективных инструментов. Данный процесс осмысления приемов использования мелких инструментов для создания более крупных инструментальных средств является ключом к стилю мышления разработчика. Этапы создания чего-то одного с использованием чего-то другого в конечном счете помогут осознать общую картину. По мере обучения созданию более мощных блоков кода представление общей картины глазами разработчика означает осознание той задачи, которую он пытается решить, и мысленное перемещение назад и вперед по шагам реализации решения. Начиная с самого маленького блока кода и заканчивая реализацией более широких функциональных возможностей, можно проложить дорогу к успеху.


28 Глава 1 1.2.2. Создание приложений С точки зрения разработчика, приложение — это полноценная программа, предоставляющая полезные функциональные возможности и пользовательский интерфейс. В качестве конкретного примера можно привести Microsoft Word, довольно крупное приложение для настольных компьютеров. А в роли весомого вебприложения может выступить Gmail от Google. Это примеры весьма солидных приложений, предоставляющих множество разнообразных функций. Существует также масса мелких приложений. К примеру, те из вас, кто умеет работать с командной строкой, доступной в большинстве компьютерных систем, возможно, знакомы с командой ping. Она запускает приложение, часто используемое для определения, отвечает ли другой компьютер, находящийся в этой же в сети, на ping-запрос. Использование ping представляет собой простой тест на устранение неполадок, позволяющий проверить, запущен ли удаленный компьютер, и порой избежать углубленного решения каких-либо других возникающих проблем. Приложение ping, по сути, находится на другом конце шкалы сложности от таких приложений, как Word или Gmail, но само по себе оно является полноценным приложением, предоставляющим полезную функцию и имеющим пользовательский интерфейс из командной строки в окне терминала. Существуют и другие блоки кода, над которыми работают разработчики, — это библиотеки программного кода. Они предоставляют полезные функциональные возможности и обладают интерфейсами, но, как правило, используются более крупными приложениями, которым нужен доступ к функциям библиотеки. Отличным примером библиотечного кода являются стандартные модули, поставляемые с Python, которые обычно называют "батарейками в комплекте". Библиотечные модули будут создаваться вами с целью использования в приложениях, разрабатываемых в ходе освоения материала данной книги. 1.3. Использование языка Python В основном все, что уже было прочитано до сих пор о стиле мышления разработчика, может применяться практически к любому языку программирования. А что тогда делает Python отличным выбором для развития мышления в стиле разработчика? Как уже упоминалось в предыдущем разделе, я считаю, что Python является идеальным решением для разработки приложений. Давайте выясним, почему я так думаю, и вы, надеюсь, разделите со мной мои доводы. 1.3.1. Парадигмы программирования Большинство языков, если не все, используемых в повседневной жизни, черпают свои возможности из других языков и парадигм программирования. Python также является полноправным членом этого клуба. Тем, кто уже пробовал программировать на языке Python, известно, что это гибкий язык, охватывающий множество об-


3 API: ДАВАЙТЕ ПООБЩАЕМСЯ Темы главы Что такое API. Какой API следует считать качественно спроектированным. Создание качественных API. Людское общение посредством устной и письменной речи, жестов, мимики и интонаций является одним из краеугольных камней развития человечества как вида. Несмотря на разницу в языках и культурах, мы все равно способны общаться друг с другом, пусть с некоторыми затруднениями, но все же можем научиться передавать смысл, намерения, информацию, цели и многое другое. По мере развития компьютерной техники создавалось множество разнообразных способов общения человека с компьютером и компьютера с человеком. Клавиатуры, мыши, сенсорные панели, звуковой ввод-вывод, экраны, принтеры, сети, датчики движения и многое другое — все это устройства, которые так или иначе используются для коммуникации людей с компьютерами. Все эти устройства являются примерами интерфейсов, предназначенных для передачи информации в компьютерную систему и из нее. Клавиатура предоставляет нам механический способ ввода печатного слова в систему. Компьютерная мышь обеспечивает один из способов указаний и порождений событий в компьютерной системе. Экран дисплея позволяет компьютеру представлять цифровую информацию понятным нам образом. Динамики дают компьютеру возможность воспроизведения аудиоинформации. Все сложности, связанные с фиксацией нажатия клавиши, размещением указателя мыши на экране компьютера или выдачей компьютером звука, проходят мимо нашего сознания и обеспечиваются интерфейсом. Интерфейсы существуют для получения информации, действий на ее основе и возвращении результатов. В интерфейсах, упомянутых выше, нуждаются пользователи компьютеров. Разработчиками также используются интерфейсы, существующие на более глубоком и абстрактном уровне компьютерных систем.


62 Глава 3 Операционной системой компьютера предоставляются сотни, а возможно, и тысячи интерфейсов, позволяющих получить доступ ко всем службам и функциональным возможностям, присущим компьютеру. Доступ к файловой системе и в конечном счете к системе хранения данных компьютера также предоставляется приложениям через интерфейс. Если компьютер подключен к сети, приложения используют интерфейсы для доступа к ней. Если приложение отображает визуальную информацию, то интерфейсы отображают ее на подключенных дисплеях. Все эти разновидности интерфейсов подпадают под более широкую общую категорию, называемую интерфейсами прикладного программирования, или API (application programming interfaces). 3.1. Начало разговора На экране компьютера выводимая из него информация абстрагируется в изображение, видимое пользователю. Мышь абстрагирует движения наших рук и нажатия кнопок, превращая их в указания компьютеру и в возбуждение событий. API-интерфейс предоставляет те же виды абстракции, но делает это не между человеком и компьютером, а между разделами программного кода. Все программы состоят из пользовательского кода, модулей и библиотек готового кода. Даже самая простая программа на Python, выводящая приветствие, print("Hello World") использует стандартный библиотечный код, поставляемый с языком Python. Возможность использования библиотечного кода — огромное преимущество, позволяющее сосредоточиться на конкретной решаемой задаче, а не на программировании всего своими силами. Представьте, что в начале каждого проекта пришлось бы создавать код функции вывода на печать или же заниматься куда более сложным кодом, например для доступа к сети. Python хорошо известен выражением "все в комплекте", означающим его поставку с обширной и мощной стандартной библиотекой модулей, предоставляющих все виды доступных к использованию функций, не требующих их создания своими силами. Существует также большой выбор доступных к установке модулей Python Package Index (https://pypi.org/), охватывающих разнообразные и качественно поддерживаемые области, представляющие интерес для разработчиков. ПРИМЕЧАНИЕ Использование уже имеющегося библиотечного кода и модулей — признак профессионального разработчика. Готовый код, как правило, хорошо протестирован и успешно используется во многих приложениях. Изобретать колесо, когда в свободном доступе уже есть вполне подходящий образец или образцы колес, нет никакого смысла. Из-за возможности использования многочисленных модулей Python порой называют "языком на склейках", поскольку он позволяет создавать интересные способы связывания воедино мощных библиотек кода. Представление о Python как о языке


API: давайте пообщаемся 63 на склейках ничуть не умаляет его эффективность, а, напротив, демонстрирует его универсальность. Свойства Python как языка на склейках обусловливаются использованием API, поддерживающем модули, что можно проследить на примере выполнения инструкции print("Hello World"), где вызывается функция print с передачей этой функции конкретного строкового аргумента "Hello World", при этом происходит абстрагирование от всех сложностей вывода текста на дисплей. Поддерживаемый соответствующим модулем API-интерфейс позволяет воспользоваться в ваших программах сложным, доведенным до совершенства кодом. 3.1.1. Соглашение, заключаемое между частями кода Давайте отвлечемся от абстрактного взгляда на API-интерфейс и посмотрим, что он представляет собой на практике. API можно рассматривать в качестве соглашения между вашим кодом и другим фрагментом кода, функциональность которого вы собираетесь использовать. Как и при соглашении между людьми, в нем оговариваются действия любой из сторон в ответ на действия другой стороны. В понятиях программирования это зачастую означает, что выполненный вполне определенным образом вызов функции или метода приводит к выполнению некой работы или возвращению некой информации, или же и к тому и к другому. При создании функции, предназначенной для использования в другом фрагменте кода, в Python создается также и API-интерфейс. Представление о том, что делает этот API, дает название, присваиваемое функции. Входные аргументы функции передают информацию в API, чтобы указать на характер выполняемой работы и предоставить данные для ее выполнения. Если функция возвращает информацию, то это считается выходными данными API. Идея передачи информации в часть кода и получения от него информации или действия бытует в компьютерной сфере довольно давно и известна как модель черного ящика. Входные данные, ожидаемые черным ящиком, и создаваемые им выходные данные вполне понятны и не требуют никаких знаний о происходящем внутри. Нужно знать всего лишь о поведении, а не о реализации. Как показано на рис. 3.1, сам термин "черный ящик" основан на идее непрозрачности внутренних компонентов вызываемой функциональности и их недоступности для просмотра. Рис. 3.1. Представление скрывающей функциональность концепции черного ящика


64 Глава 3 Вам как разработчику не обязательно знать о внутренней реализации функции print(). Нужно лишь запомнить, что функция, получив строку, ведет себя предопределенным образом — выводит эту строку на экран. Локальный API представляет собой создаваемую функцию или класс, или же модуль, импортируемый созданным вами кодом. API-интерфейс пребывает в контексте вашего программного кода, и доступ к нему осуществляется напрямую путем вызова предоставленных функций и методов экземпляра класса. Можно также вызвать удаленный API-интерфейс — например, подключиться к серверу базы данных и получить доступ к данным. В этом случае доступ к API осуществляется по сетевому подключению, обеспечивающему вашему коду транспортные механизмы для выполнения вызовов удаленного API и для получения от него ответа. Подробнее этот вопрос, в частности в отношении баз данных, будет рассматриваться в главе 10. 3.1.2. Что передается в качестве входных данных При вызове вашим кодом функции или метода API-интерфейса этот код соблюдает свою часть соглашения между вашей программой и той функциональностью, которая предоставляется через API. Входные аргументы — это информация, передаваемая из контекста вашего программного кода в контекст API через параметры. С точки зрения разработчика, аргументы — это значения, передаваемые функции, а параметры — это имена, присваиваемые этим аргументам при определении функции. Функции и методы Python поддерживают позиционные и ключевые параметры. Порядок следования позиционных параметров и имена ключевых параметров учитываются при использовании и создании API-интерфейсов. К примеру, функция print() в Python чаще всего используется следующим образом: >>> msg = "Hello World" >>> print(msg) Hello World При выполнении эта функция выводит на экран строковую переменную msg. API, предоставляемый функцией print, весьма прост для понимания: он принимает входной аргумент и выполняет работу, необходимую для его вывода на экран. В своем развернутом виде API-интерфейс функции print свидетельствует о ее куда более универсальном характере. Сигнатура функции print имеет следующий вид: print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False) В данной сигнатуре указывается, что первый параметр представляет собой кортеж параметров, не являющихся ключевыми словами, за которым следуют дополнительные ключевые параметры со значениями по умолчанию. Параметр *objects позволяет вызывающему объекту передать в функцию print сразу несколько значений, разделенных запятыми. То есть при выполнении кода >>> print("Hello World") Hello World


ЧАСТЬ II РАБОТА НАД КОНКРЕТНЫМ ЗАДАНИЕМ Приобретение базовых навыков позволяет вступить на путь решения конкретных задач с опорой на уже усвоенные приемы создания программных средств. В данной части книги вам предстоит пошаговое создание весьма практичного и красивого приложения для ведения блога. Первым шагом станет усвоение материала главы 6, где будет рассмотрено создание веб-приложения с использованием среды разработки Flask. Вам будет предоставлена возможность убедиться, насколько может упростить предлагаемую работу применение шаблонов Jinja2. Глава 7 посвящена применению стиля к вашему первому приложению и его реструктуризации, открывающей возможности его расширения. В главе 8 представлено введение в аутентификацию, позволяющую предоставлять доступ пользователям, желающим эксплуатировать ваше веб-приложение, основная часть которого будет посвящена созданию в вашем веб-приложении страниц, предназначенных для регистрации новых пользователей. В главе 9 аутентификация получит продолжение, соединяясь с авторизацией, определяющей возможности зарегистрированных пользователей в рамках работы с вебприложением с целью защиты от действий других пользователей, защиты самих этих пользователей и самого приложения. В главе 10 исследуются возможности работы с базами данных и польза, приносимая ими в вопросах долговременного хранения данных. Также будет рассмотрена суть понятия объектно-реляционного отображения — ORM (object-relational mapper) и превосходная сочетаемость данной технологии со средствами языка Python, а также способы получения доступа к базам данных. И наконец, в главе 11 будут объединены все этапы работы над конкретным заданием, чтобы в итоге добиться запуска основных функциональных свойств вебприложения по созданию контента блога и предоставления пользователям возможности комментировать публикации. К моменту завершения освоения материалов главы 11 вы уже освоите могучий арсенал инструментальных средств языка Python, что позволит смело браться за реализацию любого количества новых проектов!


6 ОБМЕН ИНФОРМАЦИЕЙ ПО ИНТЕРНЕТУ Темы главы Проектная заявка. Чем занимается веб-сервер. Микросреда Flask. Запуск сервера. В предыдущих главах во многом речь шла о том, как стать разработчиком. Теперь настал черед применению полученных знаний на практике. Чем лучше заняться? Вопрос непростой, поскольку перед нами открываются просто безграничные возможности. Намеченный к разработке проект представляет собой небольшую, но вполне работоспособную платформу для ведения блогов, которая будет называться MyBlog. Приложение MyBlog будет доступно в качестве веб-приложения, созданного на языке Python. В веб-приложении MyBlog будут предоставлены средства, позволяющие пользователям присоединяться к сообществу блогеров и создавать публикации в блогах. Зарегистрированные пользователи смогут публиковать контент, используя язык разметки для стилизации своих публикаций. Просмотр размещенного контента будет доступен всем пользователям, а зарегистрированные пользователи смогут оставлять свои комментарии. Администраторы смогут по своему усмотрению помечать любой контент или комментарии как активные или неактивные. Зарегистрированные пользователи смогут помечать любой созданный ими контент как активный или неактивный. 6.1. Делитесь своей работой с другими Веб-приложение MyBlog предоставит возможность поделиться не только своими мыслями и мнениями пользователей приложения, но и своей работой с другими заинтересованными лицами. Приложение послужит вполне определенной цели, обладая при этом множеством функций. Работа по объединению технологий для


128 Глава 6 создания полноценного программы MyBlog ведет к приобретению навыков, достойных того, чтобы их выставлять напоказ. 6.1.1. Преимущества веб-приложений Выбор проекта для создания веб-приложения обусловлен несколькими соображениями. Прежде всего, создание полезного веб-приложения вполне подходяще выстраивается на темах, раскрытых в предыдущих главах. Объединение тем инструментов разработки, именования и пространств имен, использования и создания API, а также проектирования классов позволит составить общую картину приложения. Некоторые из этих возможностей по выражению усвоенной вами информации могут быть предложены и приложениями других типов, но так же легко позволить поделиться навыками с другими людьми они вряд ли смогут. К примеру, создание настольного приложения с графическим интерфейсом ставит перед разработчиком весьма интересные задачи. Но распространить приложения с графическим интерфейсом в целях его широкого применения может быть непросто. Конечно, это можно было бы сделать с помощью Python, но описание всех необходимых для этого действий выходит за рамки данной книги. А распространение приложений посредством создания веб-сервера имеет ряд несомненных преимуществ. Сам веб-сервер, а также функции и службы располагаются централизованно, т. е. не работают во многих имеющихся у пользователей различных компьютерных средах. Наличие такого централизованного сервера означает, что изменения и обновления приложения всегда происходят в одном и том же месте. Перезапуск сервера или отправка изменений в интерактивном режиме делает изменения и обновления тотчас же доступными для всех пользователей. Еще одним преимуществом приложения на основе веб-сервера является доступность пользовательского интерфейса. Веб-приложением используется то, что установлено практически на каждом существующем компьютере, — веб-браузер. Современные веб-браузеры предоставляют мощную платформу для создания пользовательских интерфейсов. Данные могут быть отформатированы и представлены практически бесконечным количеством способов. Кроме того, имеется весьма достойная поддержка изображения и мультимедиа. Пользователи могут работать с приложениями, запущенными в браузерах, посредством элементов интерфейса: кнопок, списков, раскрывающихся списков и форм. 6.1.2. Сложности, связанные с использованием веб-приложений И все же при использовании веб-браузера в качестве платформы для приложений не все выглядит так гладко. Создание веб-приложения предполагает необходимость работы сразу в нескольких технических областях. Наряду с созданием программного кода на Python придется создавать файлы кода HTML, CSS и JavaScript. Кроме того, настольными приложениями предлагается более прямой доступ к компьютерному оборудованию и огромной вычислительной мощности персональных компьютеров.


Обмен информацией по Интернету 129 Но с постоянным развитием браузеров, появлением новых и расширением существующих веб-технологий и с неизменно увеличивающейся скоростью работы широкодоступного Интернета разрыв в производительности между настольными и вебприложениями сокращается. Кроме того, веб-системы получили широкое признание в качестве средства поставки приложений. Положительное восприятие вебприложений превращает их создание в реальный способ личного и профессионального развития. ПРИМЕЧАНИЕ Важность и значимость навыков веб-разработки трудно переоценить. По мере все более очевидного перехода пользователей с настольных на мобильные устройства, использующие преимущества повсеместного распространения Интернета, ценность этих навыков возрастает. Конечно, есть немало платформ для ведения блогов, которыми можно воспользоваться или загрузить самостоятельно. Приложение MyBlog ни в коем случае не будет конкурировать с ними, поскольку его цель — стать полезной обучающей структурой, предоставляющей цели и соответствующие им направления разработки программного кода. Все, что предлагается в данном приложении, не является какими-то новаторскими функциями или технологиями, а программные средства для ведения блогов уже давно и хорошо известны. И в этом одно из преимуществ MyBlog, поскольку вам уже известно, для чего предназначено приложение по ведению блога. Цель не в том, чтобы создать что-то выдающееся в сфере ведения блогов, а в том, чтобы рассмотреть общую картину намерений приложения и, пребывая в роли разработчика, подумать, как можно собрать воедино все части, необходимые для того, чтобы эту картину нарисовать. 6.2. Серверы Веб-приложение MyBlog является подмножеством всего того, что обычно предоставляет серверное приложение. Одним из определений сервера является приложение, работающее на компьютере или компьютерах и предоставляющее функциональные возможности другим приложениям в сети. Такое расположение нескольких приложений, получающих доступ к функциям центрального сервера, известно в качестве модели "клиент — сервер". После создания приложение MyBlog будет запускаться на вашем локальном компьютере, фактически превращая его в сервер. В сервер его превращает не аппаратная конфигурация компьютера, а то программное средство, которое на нем работает. Компоненты коммерческого серверного оборудования созданы для оптимизации доступа, необходимого для правильной работы серверного программного средства, но в остальном это просто компьютеры. Все мы пользуемся социальными сетями и работаем с программами, запущенными на наших настольных компьютерах или мобильных устройствах. Соответствующие


130 Глава 6 инструменты представляют собой клиентские приложения, использующие функциональные возможности многих серверов. В многопользовательских играх, игровых приложениях для координации всех действий игроков в той или иной игре используются функциональные возможности сервера. На рис. 6.1 показано множество типов устройств, подключающихся к серверу по сети. Рис. 6.1. Несколько устройств, подключающихся к функциональным возможностям, предоставляемым сервером 6.2.1. Модель "запрос — ответ" Одной из весьма распространенных реализаций сервера является модель "запрос — ответ". Клиентское приложение отправляет запрос на сервер, который его обрабатывает и возвращает ответ. В приложениях такого типа сервер, пока его об этом не попросят, не предпринимает абсолютно никаких действий. В веб-приложении клиентский браузер отправляет для получения ответа HTTPзапрос на сервер. Ответ очень часто является текстовым потоком, представляющим HTML-страницу. Когда клиентский браузер получает ответ, он отображает HTML в своем окне. В зависимости от HTML-кода, создающего страницу, могут также делаться дополнительные запросы к серверу для получения каскадных страниц стилей (cascading style sheet, CSS ) и файлов JavaScript. На рис. 6.2 показана упрощенная схема связи типа "запрос — ответ", установленная между клиентом и сервером на какой-то промежуток времени. Сначала клиент отправляет запрос на сервер, которому может понадобиться извлечение информации из базы данных для составления ответа. Когда ответ готов, он отправляется клиенту. В данном примере ответ представляет собой HTML-страницу, которую клиентское приложение отобразит в окне браузера. Обмен данными для отображения HTMLстраницы показан на рис. 6.2. Часть кода HTML включает ссылки на файлы CSS и


Обмен информацией по Интернету 131 JavaScript, которые порождают дополнительные запросы к серверу. Сервер извлекает запрошенные файлы со своего жесткого диска и отправляет их в качестве ответа клиенту. Модель "запрос — ответ" является тем самым основным средством, которое будет использоваться веб-приложением MyBlog для получения данных с сервера, построения и предоставления пользователям информации о приложении. Рис. 6.2. Поток событий при взаимодействии клиента с веб-сервером для создания веб-страницы 6.3. Веб-серверы Веб-сервер является приложением, отвечающим на HTTP-запросы клиентского приложения. А веб-браузер является клиентским приложением, отправляющим запросы к веб-серверу, интерпретирующим ответы и отображающим их на экране. Зачастую в веб-браузер клиента отправляются HTML-документы, интерпретируемые браузером и отображаемые им как веб-страницы. HTML-документы являются содержимым, запрошенным клиентом. Имеется также множество других моментов взаимодействия между браузером клиента и веб-сервером. Браузер может запрашивать у сервера отправку изображений, аудио- и видеоконтента и даже загружать другие приложения на компьютер клиента. Документы HTML могут содержать ссылки на файлы CSS и JavaScript. Когда полученный код HTML обрабатывается веб-браузером, встроенные ссылки на эти фай-


132 Глава 6 лы порождают дополнительные HTTP-запросы к веб-серверу. Веб-сервер отвечает, отправляя запрошенный контент. ПРИМЕЧАНИЕ Для того чтобы предоставить контент и отобразить то, что пользователь ожидает от веб-приложения, современные веб-приложения делают к одному или нескольким серверам множество запросов. Файлы CSS содержат информацию о стилях, применяемую к содержимому отображаемого на экране HTML-документа. Код CSS изменяет внешний вид вебстраницы и является уровнем представления содержимого HTML. Файлы JavaScript содержат код, запускаемый на выполнение в браузере клиента. Код JavaScript начнет выполняться веб-браузером после его загрузки. Этот код может быть связан со щелчками на экранных кнопках, с обновлениями дисплея, и практически любое действие, которое может быть выполнено пользователем на веб-странице, может быть обработано кодом JavaScript. Код JavaScript также может выполнять HTTP-запросы к веб-серверам на получение текста и данных. Эти запросы могут быть инициированы действиями пользователя или программным способом и способны динамически изменять и обновлять вебстраницы. HTTP-ЗАПРОСЫ Определение протокола HTTP не входит в перечень тем, рассматриваемых в данной книге, но некоторая базовая информация вам пригодится. Вот как выглядит пример HTTP-запроса к веб-серверу: 1 GET /path_part/index.html HTTP/1.1 2 Host: fictional_website.com:80 3 Accept: text/html, */* 4 <CR-LF> Номера строк в этом примере не являются частью запроса и были добавлены для ссылки на эти строки при объяснении сути протокола: 1. GET /path_part/index.html HTTP/1.1 — начало запроса к веб-серверу. Слово GET указывает на используемый HTTP-метод, в данном случае — для извлечения документа, расположенного по адресу /path_part/index.html, с использованием протокола HTTP версии 1.1. 2. Host: fictional_website.com:80 — указание на домен, суффикс и номер порта, куда отправляется запрос. Номер порта (80) является необязательным и, если он отсутствует, то по умолчанию равен 80. – Суффикс домена — это текстовое имя сервера, на котором размещен вебсайт. Это имя преобразуется сервером доменных имен (domain name server, DNS) в IP-адрес, позволяющий сетевому протоколу направить запрос на нужный сервер в Интернете.


Обмен информацией по Интернету 133 – Суффикс берется из списка суффиксов, помогающих управлять доменами и различать их в Интернете. Вам, наверное, уже знакомы такие суффиксы, как ".com" и ".net", но есть и много других суффиксов. Их наличие делает "myserver.com" и "myserver.net" двумя разными именами. – Сетевые карты Ethernet могут поддерживать 65 353 логических порта, причем номера от 0 до 1023 зарезервированы для общеизвестных портов, используемых обычными приложениями. Например, порт 80 обычно используется вебсерверами, поэтому он применяется по умолчанию, если в URL-адресе нет конкретного указания. Но сервер, включая и веб-серверы, может работать, используя любой порт из диапазона, который еще не задействован. 3. Accept: text/html, */* — необязательная информация, помещаемая в заголовок. В данном примере она служит указанием серверу, какие типы ответов клиент может принять. Может быть множество различных заголовков, каждый из которых содержит дополнительную информацию от клиента, способную пригодиться веб-серверу. 4. <CR-LF> — символы возврата каретки и перевода строки или же пустая строка, являющаяся обязательной частью протокола HTTP, завершающей список заголовков и заставляющей сервер приступить к обработке запроса. На первых порах моих занятий веб-разработкой я был удивлен тем, что показанный здесь и разбитый на составляющие на рис. 6.3 небольшой текстовый блок именно в таком виде и был отправлен по сети на сервер. В первых двух строках запроса создается унифицированный указатель ресурсов (uniform resource locator, URL), который однозначно идентифицирует то, что запрашивается клиентом. Рис. 6.3. Полностью сформированный URL-адрес, однозначно идентифицирующий извлекаемый ресурс Сервер получает данный запрос и выполняет одно из следующих действий: сопоставляет запрос с файлом, находящимся под управлением сервера, и возвращает этот файл клиенту; отправляет запрос обработчику (коду программы) и возвращает результат обработчика клиенту; определяет невозможность ответа на запрос и возвращает сообщение об ошибке.


134 Глава 6 Использование слеша (/) очень похоже на использование такого же символа в качестве разделителя пути для каталогов и файлов в файловой системе. Данная схема помогает представить иерархию логических путей ресурсов и контента, происходящих из корневого домена fictional_website.com. Логическая иерархия создается за счет возможности использования составных путей. Приложение браузера может перемещаться по иерархии, получая доступ к различным частям веб-сервера. Конечной точкой URL-адреса может быть фактический файловый ресурс, предоставляемый веб-сервером, хотя это и не обязательно. Созданный логический путь не может иметь абсолютно никакого отношения к фактическому файловому пути к ресурсу в файловой системе сервера. 6.4. Flask Приложение MyBlog будет создаваться с использованием Flask — упрощенной среды разработки веб-приложений на языке Python. Flask предоставляет механизмы и инфраструктуру, необходимые для использования Python в качестве сервера вебприложений с целью создания полноценных приложений, способных хорошо работать и масштабироваться. Flask обеспечивает возможность отвечать на HTTPзапросы ресурсов URL и связывать эти запросы с кодом на языке Python, создающим ответы в динамическом режиме. Flask (https://flask.palletsprojects.com/en/2.1.x/) не относится к модулям стандартной библиотеки, поставляемым вместе с Python, но доступен как модуль стороннего разработчика, размещенный в индексе пакетов Python (Python Package Index, https://pypi.org/), что позволяет устанавливать его с помощью утилиты pip, точно так же, как и другие доступные для Python модули. 6.4.1. Почему именно Flask? Python в качестве языка создания веб-приложений приобрел весьма широкую популярность. Поэтому существует довольно много инструментов и сред, которые можно использовать с языком Python для создания веб-приложений, и Flask не является исключением. Конкурентами этой среды могут стать Django, Bottle, Pyramid, Turbogears, CherryPy и многие другие. Все эти среды по-своему полезны: у некоторых, в отличие от иных, имеется более конкретный вариант использования, другие обладают более высоким быстродействием, а какие-то специально предназначены для создания определенных видов веб-приложений и служб. Flask является некой усредненной системой и пользуется популярностью благодаря своей компактности, минимальному сроку освоения и хорошо вписывается в процесс развития ваших навыков и роста потребностей. С Flask интегрируется множество других доступных модулей, которые будут использоваться по мере совершенствования приложения MyBlog. Модули откроют приложению MyBlog доступ к базам данных, аутентификации, авторизации и созданию форм. Привлекает в среде Flask и то, что изучать и использовать все эти расширенные возможности не пона-


Обмен информацией по Интернету 135 добится, пока в них не возникнет насущная потребность и вы не будете готовы создавать с их помощью новые функции. ПРИМЕЧАНИЕ Мне приходилось в роли разработчика работать с некоторыми другими платформами для создания веб-приложений, допускающими использование языка Python. Но при этом больше всего применялась именно среда Flask, с которой я знаком доскональнее всех остальных сред. Мой выбор остановился на Flask, поскольку я могу рассказать все, что нужно, об этой среде и представить Flask с максимальной выгодой для вас, не упустив при этом все тонкости, которые прошли бы мимо вашего внимания, выбери я какую-нибудь другую, менее знакомую мне среду. 6.4.2. Ваш первый веб-сервер Теперь, когда намечен предстоящий путь, давайте начнем. Первый сервер взят непосредственно из Flask-примера быстрого запуска веб-сайта, и он как нельзя лучше подходит для начала изучения порядка работы со средой Flask. Речь идет о классическом примере программы "Hello World", представленной в виде вебприложения. Код для создания сервера доступен в репозитории, в файле examples/CH_06/examples/01/app.py: from flask import Flask app = Flask(__name__) @app.route("/") def home(): return "Hello World!" Импортирование системы Flask в приложение. Создание объекта, представляющего собой экземпляр Flask, с передачей ему имени текущего файла. Применение декоратора, соединяющего функцию home с маршрутом приложения "/". Функция home будет запущена, когда пользователь перейдет к маршруту "/". После выполнения всех этапов установки, позволяющих использовать примеры главы, и запуска виртуальной среды Python приложение запускается путем открытия окна терминала и перехода в каталог examples/CH_06/examples/01. Работая под управлением Mac и Linux, нужно запустить следующую команду: export FLASK_ENV=development export FLASK_APP=app.py


136 Глава 6 А работая под Windows, нужно ввести такую команду: set FLASK_ENV=development set FLASK_APP=app.py После этого нужно ввести команду flask run, и приложение выведет в окно терминала следующий текст: * Serving Flask app "app.py" (lazy loading) * Environment: development * Debug mode: on * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit) * Restarting with stat * Debugger is active! * Debugger PIN: 325-409-845 Данные сообщения могут вас насторожить, но это просто информация о том, что веб-сервер работает в режиме разработки, который не подходит для реальной работы, означающей в данном контексте запуск веб-сервера в общедоступном режиме. Встроенный сервер режима разработки Flask недостаточно оптимизирован или безопасен, что не позволяет использовать его в реальных условиях. Обратите также внимание на предоставленное вам сообщение, что для остановки приложения следует воспользоваться комбинацией клавиш <Ctrl>+<C>. Также заметьте, что курсор терминала не возвращается, потому что команда flask run запускает экземпляр приложения в бесконечном цикле, ожидая получения и обработки запросов. Сервер предназначен для работы в течение длительного времени и, по сути, без специальной инструкции не остановится. Только что запущенный сервер находится в режиме простоя, ожидая получения и обработки HTTP-запросов. Сервер режима разработки системы Flask по умолчанию работает с IP-адресом 127.0.0.1 на порту 5000. IP-адрес 127.0.0.1 известен как localhost и является интерфейсом, зацикленным на сетевой интерфейс вашего компьютера. То есть по этому адресу можно создавать серверы и получать к ним доступ, даже если на вашем компьютере не установлена сетевая карта. Число 5000 выбрано для значения порта просто потому, что это неиспользованный номер из 65 535 номеров портов, доступных на сетевых интерфейсах. Оба значения можно настроить, но пока они вполне подходят в качестве исходных значений. Для взаимодействия с сервером нужно открыть на своем компьютере веб-браузер, набрать в адресной строке URL-адрес http:/./127.0.0.1:5000 и перейти по нему, нажав клавишу <Enter>. В ответ браузер выведет в окне содержимого "Hello World!". В окне терминала, где работает сервер, также появится регистрационное сообщение, указывающее, что запрос был получен и обработан правильно, о чем свидетельствует число 200 в конце данного сообщения. Значение 200 — это код состояния HTTP для "OK", означающего, что запрос был обработан успешно.


9 КАКИЕ ДЕЙСТВИЯ ВАМ РАЗРЕШЕНЫ? АВТОРИЗАЦИЯ Темы главы Добавление входа-выхода в навигацию по страницам. Подтверждение новых пользователей по электронной почте. Разрешение пользователям сбрасывать забытые пароли. Разрешение существующим пользователям менять пароли. Добавление пользователям ролей авторизации. Засекречивание маршрутов в приложении. В предыдущей главе были созданы возможности поддержки пользователей, входящих и выходящих из приложения MyBlog. Вход и выход из системы — весьма важная функция, которую нужно сделать легкодоступной для пользователей. Поэтому эта функция организации рабочего пространства будет добавлена в родительский шаблон base.html, что откроет к ней доступ из любого места приложения MyBlog. 9.1. Переход ко входу и выходу Мы создали работоспособную систему аутентификации, но пока доступ к ней осуществляется прежде всего путем ввода URL-адреса в адресную строку браузера. Давайте добавим URL-маршруты входа-выхода в систему переходов Bootstrap. Система аутентификации имеет два взаимоисключающих состояния пользователя и позволяет либо войти в систему, либо выйти из нее. Из-за этого система аутентификации представлена в меню навигации как единый элемент, переключающий состояния в зависимости от текущего статуса аутентификации пользователя. По принципу единственной ответственности и избегая ненужные усложнения кода шаблона base.html, функциональность меню входа-выхода нужно будет размес-


Какие действия вам разрешены? Авторизация 231 тить в приложении в виде Jinja-макроса, который находится в файле examples/CH_09/examples/01/app/templates/macros.jinja: {% macro build_login_logout_items(current_user) %} {% if not current_user.is_authenticated %} {% if request.endpoint == "auth_bp.login" %} <a class="nav-link ml-2 active" aria-current="page" href="{{url_for('auth_bp.login')}}"> {% else %} <a class="nav-link ml-2" href="{{url_for('auth_bp.login')}}"> {% endif %} Login </a> {% else %} <a class= "nav-link ml-2" href=" {{url_for('auth_bp.logout')}}"> Logout </a> {% endif %} {% endmacro %} Начало макроса build_login_logout_items с передачей данных о текущем пользователе из шаблона base.html. Авторизован ли текущий пользователь? Предоставление пункта меню входа и маршрута, выделенного или же нет в зависимости от текущего маршрута. Действия, если текущий пользователь аутентифицирован. Представление пункта меню выхода из системы и маршрута. Макрос build_login_logout_items() переключит отображение навигации, показывая "вход" или "выход" в зависимости от состояния аутентификации пользователя. Два пункта меню привязаны к конечным точкам URL-адреса входа и выхода. Макрос добавляется в шаблон base.html, позволяя системе отображать его на любой странице, предоставляемой приложением MyBlog. Для того чтобы добавить данную функциональную возможность, нужно внести изменения в тот раздел кода шаблона base.html, который создает меню переходов: <div class=" collapse navbar-collapse justify-content-between" id= "navbarSupportedContent"> <div class=" navbar-nav mr-auto">


232 Глава 9 {{ macros.build_nav_item(nav_item) }} </div> <div class="navbar-nav"> {{ macros.build_login_logout_items(current_user) }} </div> </div> Выравнивание по правой и левой стороне двух разделов navbar-nav. Создание второго раздела navbar-nav и вызов макроса для отображения пунктов входа-выхода. После внесения вышеуказанных изменений веб-приложение MyBlog будет отображать выделенный пункт меню входа в систему, когда на нем будет сделан щелчок и программой будут выполнены соответствующие действия. После запуска приложения из каталога examples/CH_09/examples/01 появится отображаемый элемент меню входа в систему. На рис. 9.1 показан снимок экрана обновленной страницы входа. Рис. 9.1. Форма регистрации входа пользователя, включая только что добавленный пункт меню входа 9.2. Подтверждение новых друзей Когда потенциальный пользователь приложения MyBlog регистрируется в системе, важно подтвердить, кем он является на самом деле. Зачастую это делается путем отправки электронного письма со ссылкой для подтверждения на адрес электронной почты, с указанием которого прошла регистрация. Поскольку приложение MyBlog использует адрес электронной почты пользователя в качестве уникального идентификатора, отправка электронного письма с подтверждением на этот адрес замыкает цикл, в котором пользователь намеревался зарегистрироваться в приложении MyBlog. Теперь нужно добавить в приложение MyBlog возможность отправки электронных писем, позволяющую высылать подтверждения.


12 И ЧТО, НА ЭТОМ ВСЁ? Темы главы Тестирование. Отладка. Инструменты. Сеть. Сотрудничество. И что, на этом все? Так помогите же мне улучшить эту книгу! Кроме шуток, прочтение книги станет для разработчика Python немалым шагом к совершенствованию его навыков. Если приведенные в ней примеры проработаны и код MyBlog написан, то это будет свидетельством того, что вами создано интересное приложение и вам удалось справиться с его уровнем сложности. При этом для создания единого целого, обладающего широким набором полезных свойств, были объединены инструменты и методы из многих областей разработки программных продуктов. Более того, на данном пути применялись передовые методы управления сложностью приложения. А это означает, что приложение MyBlog пригодно для длительного сопровождения и расширения без опасений внесения хрупкости в его структуру. Для того чтобы ответить на вопрос "И что, на этом всё?", можно воспользоваться извечной фразой: "И да и нет". Давайте все же выясним, в чем заключается природа неоднозначности такого ответа и является ли он настоятельным и привлекательным приглашением в полное новых приключений путешествие, манящее своей возможностью дальнейшего расширения навыков разработчика. 12.1. Тестирование Тестирование программных продуктов — весьма важный аспект их создания. Я намеренно не включал в книгу никаких размышлений или примеров, связанных с тестированием представленного в ней кода. И на то есть несколько причин.


320 Глава 12 Во-первых, при написании тестового кода зачастую выполняется не меньший объем работы, чем при создании самого тестируемого кода. Это, конечно, не повод избегать тестирования, но в контексте данной книги это привело бы к добавлению еще одной технической области работы над примерами, отвлекая от возлагаемой на них чисто образовательной цели. Во-вторых, тестирование программного обеспечения является слишком объемной темой, заслуживающей отдельной книги. Включение подмножества всего, что можно подвести под понятие "тестирование программных продуктов", оказало бы медвежью услугу не только предмету вопроса, но и читателю книги. Отличной книгой по тестированию программ на Python является "Python Testing with pytest" Брайана Оккена (Brian Okken) (http://mng.bz/Zql9). От автоматизации тестирование программного продукта только выигрывает. Использование для автоматизации тестов инструментов и инфраструктур тестирования (например, pytest) обеспечивает согласованность кода и предупреждение об изменении условий в ходе разработки на самой ранней стадии. Кроме того, в большинстве случаев предпочтительнее проведение тестирования не разработчиком приложения, а кем-то другим. Разработчику слишком легко неосознанно следовать "оптимальным маршрутом", приводящим к желаемым результатам. А это сильно отличается от действий пользователей вашего программного продукта. Они доведут вашу программу до крайностей, заводя ее в совершенно непредусмотренные тупики. При этом следует учитывать, что к разрабатываемым приложениям и их коду применяется множество различных приемов тестирования. 12.1.1. Модульное тестирование Модульное тестирование является одним из тех случаев, когда тесты создаются разработчиком приложения. При модульном тестировании функция или компонент изолируется, после чего проверяется возможность обработки входных данных, передаваемых в функцию, и выдачи ожидаемых выходных данных. Помимо проверки того, что ожидаемые входные данные приводят к производству ожидаемых выходных данных, тесты должны проверять крайние случаи. При проведении тестов следует определить, насколько разумно функция обрабатывает неожиданные входные данные и не выдается ли на выходе ожидаемое состояние ошибки или исключение. Модульные тесты должны подвергать проверке только тестируемую функцию или компонент, а не зависимости тестируемого кода от внешних ресурсов, находящихся за пределами возможностей среды тестирования по контролю или прогнозированию. Доступ к базе данных, к сети или к какой-либо непредсказуемой и ограниченной по времени операции может привести к сбою теста из-за сбоя ресурса. В таких случаях, чтобы тест был повторяемым, внешний ресурс должен быть сымитирован. При имитации внешнего ресурса реальный объект этого ресурса заменяется чем-то, что имитирует его поведение, но повторяемым и стабильным способом.


ПРЕДМЕТНЫЙ УКАЗАТЕЛЬ _ __builtins__, объект 48 A Alembic 277 Application programming interfaces (API) 62 B Bcrypt, модуль 205 Better Jinja 341 Blueprints 174 Bootstrap 160, 220, 310 C Cascading style sheet (CSS) 130, 132 Code Runner 340 Common table expressions (CTE) 306 Content delivery network (CDN) 162 Cross-site scripting (XSS) 316 D Docker 154 docstring 69 DotENV 341 E Entity relationship diagram (ERD) 263 F Flask 134 Flask Debug Toolbar 188 Flask-WTF 213 G Gunicorn 154 H HTTP-запрос 132 I IntelliSense 33 J JavaScript-код 132, 152 Jinja2 138 JSON 328 N NoSQL 328 P pdb 34


346 Предметный указатель POST-запрос 204, 208, 213, 217, 225, 227, 311 PowerShell 337 PyCharm 33 PyTest 29 Python Docstring Generator 340 Python Package Index 32, 62, 84, 134, 203 Python REPL 71 S SendInBlue 233 SQLAlchemy 204, 271 SQLite 271 Structured Query Language (SQL) 267, 268 U Unified Modeling Language (UML) 82 Universally unique identifier (UUID) 210, 264 uWSGI 154 V Visual Studio Code 33, 339 VSCode 339 W Web Server Gateway Interface (WSGI) 153 WingIDE 34 А Авторизация 247 Аргумент, передача по ссылке 76 Атрибут закрытый 90 Аутентификация 200, 203 Б База данных 327 NoSQL 328 нормализация 264 транзакций 266 Безопасность 246 В Веб-сервер 131 Время жизни 54 Г Геттер 88 Д Декоратор 89, 91 Диаграмма: ERD 263 UML 82 Дизайн адаптивный 159 Документирование 69, 77 Ж Журнал 192 Журналирование 324 И Идемпотентность 75 Идентификатор универсальный уникальный 210, 264 Имя: присвоение 41 функции 69 Инициализатор __init__() 97 Интерфейс: аппаратный 61 прикладного программирования 62


Предметный указатель 347 Исключение 111 AttributeError 65 KeyboardInterrupt 116 TypeError 70 ValueError 113 ZeroDivisionError 111 обработка 113 пользовательское 121 К Класс 81 Ключ: внешний 263 первичный 210, 263, 264 Комментарии 310 Композиция 104 Контейнер 327 Контекст 80 Конфиденциальность 186 Л Линтер 343 М Маршрут: авторизация 250 защита 246 Метод 82 __init__() 82, 99, 101, 102 Модель: запрос — ответ 130 клиент — сервер 129 Модуль 52 аркадный 84 Н Наследование 94 Нормализация 264 О Область видимости 54 Обработка: исключений 113 ошибок 314 Общее табличное выражение 306 Окно модальное 311 Оптимизация 326 Отладка 323 Ошибка: воспроизведение 323 обработка 314 П Пакет 51 Панель инструментов отладки Flask 187 Параметр: ключевой 64, 70 словарь 72 позиционный 64, 70 количество переменное 71 список параметров 71 Пароль, сброс 239 Переменная 54 Полиморфизм 102 Присвоение имени 41 Пространство имен 47, 174 Профиль 243 Публикация 285 Р Роль 247 администратор 247, 251 зарегистрированный пользователь 247 редактор 247 С Связь: многие ко многим 266 один ко многим 265 Сервер 129 Сессия 201 Сеттер 88 Система управления базами данных (СУБД) 262 Скриптинг межсайтовый 316 Словарь ключевых параметров 72 Советы по Python-программированию 71 Справочная система 78 Стек вызовов 111 Стиль приложения 157 нормализация 159 Суффикс домена 132


348 Предметный указатель Т Таблица 262 Тестирование 319 доступности 322 интеграционное 321 модульное 320 нагрузочное 321 приемочное 322 производительности 321 регрессионное 322 сквозное 321 функциональное 321 Точка останова 323 Трассировка стека 111 У Уведомление всплывающее 220 Унифицированный язык моделирования 82 Ф Фабрика приложений 172 Фавикон 196 Файл 256 __init__.py 51 cookie 201 CSS 132 CSV 256 JavaScript 132 Файловая система 256 Форма, защита 253 Функция: длина 74 значение возвращаемое 67 имя 69 Ч Черный ящик 63 Э Экземпляр 81 Электронная почта 233 Я Язык структурированных запросов 267, 268


Click to View FlipBook Version