Logout succeed
Logout succeed. See you again!

Программирование на Python (в 2-х томах) том 2 PDF
Preview Программирование на Python (в 2-х томах) том 2
Эффективное объектно-ориентированное программирование ох 4- ва е т и ы з Программирование на Python, том II вае да т н P и yt е Монументальный труд Марка Лутца в 2-х томах представляет собой подробное ЧЕТВЕРТОЕ ИЗДАНИЕ h o руководство по применению языка программирования Python в основных приклад- n ных областях – системном администрировании, создании графических интерфей- том II 3.Х Программирование на сов и веб-приложений. Исследуются приемы работы с базами данных, приемы про- граммирования сетевых взаимодействий, создания интерфейсов для сценариев, обработки текста и многие другие. Несмотря на то, что на протяжении всей книги используется язык Python, тем не менее основное внимание уделяется не основам н П Python языка, а приемам решения практических задач. В книгу включено большое количество примеров, иллюстрирующих типичные иди- а р омы программирования и корректное их применение. Кроме того, исследуется эффективность Python в качестве инструмента разработки программного обеспе- P о чения, в отличие от просто инструмента «создания сценариев». В четвертое издание y г включено описание новых особенностей языка, биб лиотек и практических приемов программирования для Python 3.X. Примеры, представленные в книге, опробованы t р под третьей альфа-версией Python 3.2. h а Во втором томе рассматриваются следующие темы: o м • Создание сценариев для Интернета. Описывается порядок использования n сетевых протоколов и инструментов электронной почты на стороне клиента, м том II применение сценариев CGI и рассказывается о приемах реализации веб-сайтов. • Другие способы применения Python. Обсуждаются реализация структур и данных, обработка текстовых данных, взаимодействие с базами данных, а также рассказывается о расширении и встраивании Python. р о «В этой книге вы найдете все – от приемов отладки до рекомендаций по проекти- рованию, что поможет вам решать масштабные задачи и обходить типичные в препятствия.» Диана Донован (Diane Donovan), California Bookwatch а н Марк Лутц (Mark Lutz) является ведущим специалистом в области обучения языку Python. Вот уже 25 лет Марк занимается разработкой программного обеспечения и и является автором предыдущих изданий книги «Программирование на Python», а также книг «Изучаем Python» и «Python Pocket Reference», выпущенных издатель- е ством O’Reilly. Категория: программирование Издательство «Символ-Плюс» Уровень подготовки читателей: средний (812) 380-5007, (495) 638-5305 Л у т ц www.symbol.ru Марк Лутц Python_progr_cover_tom-2_PonD.indd 1 18.10.2011 13:39:26 По договору между издательством «Символ-Плюс» и Интернет-магазином «Books.Ru – Книги России» единственный легальный способ получения дан- ного файла с книгой ISBN 978-5-93286-211-7, название «Программирование на Python, 4-е издание, том 2» – покупка в Интернет-магазине «Books.Ru – Книги России». Если Вы получили данный файл каким-либо другим обра- зом, Вы нарушили международное законодательство и законодательство Рос- сийской Федерации об охране авторского права. Вам необходимо удалить данный файл, а также сообщить издательству «Символ-Плюс» (piracy@ symbol.ru), где именно Вы получили данный файл. Programming Python Fourth Edition Mark Lutz Программирование Python на II том Четвертое издание Марк Лутц Санкт-Петербург – Москва 2011 Марк Лутц Программирование на Python, том II, 4-е издание Перевод А. Киселева Главный редактор А. Галунов Зав. редакцией Н. Макарова Редактор Ю. Бочина Корректор С. Минин Верстка Д. Орлова Лутц М. Программирование на Python, том II, 4-е издание. – Пер. с англ. – СПб.: Сим- вол-Плюс, 2011. – 992 с., ил. ISBN 978-5-93286-211-7 Монументальный труд Марка Лутца представляет собой учебник по примене- нию языка Python в системном администрировании, для создания графиче- ских интерфейсов и веб- приложений. Исследуются приемы работы с базами данных, программирования сетевых взаимодействий, создания интерфейсов для сценариев, обработки текста и многие другие. Несмотря на то, что на про- тяжении всей книги используется язык Python, тем не менее основное внима- ние уделяется не основам языка, а приемам решения практических задач. Второй том включает материалы по созданию сценариев для Интернета. Опи- сывается порядок использования сетевых протоколов и инструментов элек- тронной почты на стороне клиента, применение CGI-сценариев, рассматрива- ются приемы реализации веб- сайтов. Далее обсуждаются дополнительные темы, касающиеся разработки приложений на Python, а именно: технологии хранения информации между запусками программы – файлы DBM, сериали- зация объектов, хранилища объектов и интерфейсы Python к базам данных SQL; приемы реализации более сложных структур данных на Python – стеков, множеств, двоичных деревьев поиска, графов и др.; инструменты и приемы, используемые в языке Python для синтаксического анализа текстовой инфор- мации; приемы интеграции – расширение Python с помощью компилируемых библиотек и встраивание программного кода на Python в другие приложения. ISBN 978-5-93286-211-7 ISBN 978-0-596-15810-1 (англ) © Издательство Символ-Плюс, 2011 Authorized Russian translation of the English edition of Programming Python, Fourth Edition ISBN 9780596158101 © 2011 O’Reilly Media, Inc. This trans lation is pub- lished and sold by permission of O’Reilly Media, Inc., the owner of all rights to publish and sell the same. Все права на данное издание защищены Законодательством РФ, включая право на полное или час- тичное воспроизведение в любой форме. Все товарные знаки или зарегистрированные товарные зна- ки, упоминаемые в настоящем издании, являются собственностью соответствующих фирм. Издательство «Символ-Плюс». 199034, Санкт-Петербург, 16 линия, 7, тел. (812) 380-5007, www.symbol.ru. Лицензия ЛП N 000054 от 25.12.98. Подписано в печать 18.10.2011. Формат 70×100 1/16. Печать офсетная. Объем 62 печ. л. Оглавление Оглавление Часть IV. Создание сценариев для Интернета . . . . . . . . . . . . . . . . . . . .15 Глава 12. Сетевые сценарии . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .17 «Подключись, зарегистрируйся и исчезни» . . . . . . . . . . . . . . . . . . . .17 Темы, касающиеся разработки сценариев для Интернета . . . . . .19 Опробование примеров этой части книги . . . . . . . . . . . . . . . . . . . .22 Другие возможности разработки сценариев для Интернета на языке Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .25 Трубопровод для Интернета . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .30 Слой сокетов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .30 Слой протоколов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .32 Библиотечные модули Python для Интернета . . . . . . . . . . . . . . . .36 Программирование сокетов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .38 Основы сокетов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .40 Запуск программ, использующих сокеты, на локальном компьютере . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .47 Запуск программ, использующих сокеты, на удаленном компьютере . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .48 Параллельный запуск нескольких клиентов . . . . . . . . . . . . . . . .52 Подключение к зарезервированным портам . . . . . . . . . . . . . . . . .56 Обслуживание нескольких клиентов . . . . . . . . . . . . . . . . . . . . . . . . . .58 Ветвление серверов. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .58 Многопоточные серверы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .73 Классы серверов в стандартной библиотеке . . . . . . . . . . . . . . . . . .76 Мультиплексирование серверов с помощью select . . . . . . . . . . . .79 Подводя итоги: выбор конструкции сервера . . . . . . . . . . . . . . . . .87 Придание сокетам внешнего вида файлов и потоков ввода-вывода . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .88 Вспомогательный модуль перенаправления потоков ввода-вывода . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .89 Простой файловый сервер на Python . . . . . . . . . . . . . . . . . . . . . . . . .104 Запуск сервера файлов и клиентов . . . . . . . . . . . . . . . . . . . . . . . .107 Добавляем графический интерфейс пользователя . . . . . . . . . . .108 6 Оглавление Глава 13. Сценарии на стороне клиента . . . . . . . . . . . . . . . . . . . . . .119 «Свяжись со мной!» . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .119 FTP: передача файлов по сети . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .120 Передача файлов с помощью ftplib . . . . . . . . . . . . . . . . . . . . . . . . . . .121 Использование пакета urllib для загрузки файлов . . . . . . . . . . .125 Утилиты FTP get и put . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .127 Добавляем пользовательский интерфейс . . . . . . . . . . . . . . . . . . .136 Передача каталогов с помощью ftplib . . . . . . . . . . . . . . . . . . . . . . . . .144 Загрузка каталогов сайта . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .145 Выгрузка каталогов сайтов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .153 Реорганизация сценариев выгрузки и загрузки для многократного использования . . . . . . . . . . . . . . . . . . . . . . . .158 Передача деревьев каталогов с помощью ftplib . . . . . . . . . . . . . . . . .168 Выгрузка локального дерева каталогов . . . . . . . . . . . . . . . . . . . .168 Удаление деревьев каталогов на сервере . . . . . . . . . . . . . . . . . . . .172 Загрузка деревьев каталогов с сервера . . . . . . . . . . . . . . . . . . . . .176 Обработка электронной почты . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .176 Поддержка Юникода в Python 3.X и инструменты электронной почты . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .177 POP: чтение электронной почты . . . . . . . . . . . . . . . . . . . . . . . . . . . . .179 Модуль настройки электронной почты . . . . . . . . . . . . . . . . . . . . .180 Сценарий чтения почты с сервера POP . . . . . . . . . . . . . . . . . . . . .183 Извлечение сообщений . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .186 Чтение почты из интерактивной оболочки . . . . . . . . . . . . . . . . .189 SMTP: отправка электронной почты . . . . . . . . . . . . . . . . . . . . . . . . . .190 Сценарий отправки электронной почты по SMTP . . . . . . . . . . . .192 Отправка сообщений . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .194 Отправка почты из интерактивной оболочки . . . . . . . . . . . . . . .202 Пакет email: анализ и составление электронных писем . . . . . . . . .203 Объекты Message . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .205 Базовые интерфейсы пакета email в действии . . . . . . . . . . . . . . .208 Юникод, интернационализация и пакет email в Python 3.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .211 Почтовый клиент командной строки . . . . . . . . . . . . . . . . . . . . . . . . .238 Работа с клиентом командной строки pymail . . . . . . . . . . . . . . .244 Вспомогательный пакет mailtools . . . . . . . . . . . . . . . . . . . . . . . . . . . .249 Файл инициализации . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .250 Класс MailTool . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .252 Класс MailSender . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .252 Класс MailFetcher . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .262 Класс MailParser . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .274 Сценарий самотестирования . . . . . . . . . . . . . . . . . . . . . . . . . . . . .283 Обновление клиента командной строки pymail . . . . . . . . . . . . . .286 Оглавление 7 NNTP: доступ к телеконференциям . . . . . . . . . . . . . . . . . . . . . . . . . .293 HTTP: доступ к веб-сайтам. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .296 Еще раз о пакете urllib . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .300 Другие интерфейсы urllib . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .302 Прочие возможности создания клиентских сценариев . . . . . . . . . .306 Глава 14. Почтовый клиент PyMailGUI . . . . . . . . . . . . . . . . . . . . . . . .309 «Пользуйся исходными текстами, Люк!» . . . . . . . . . . . . . . . . . . . . .309 Модули с исходными текстами и их объем . . . . . . . . . . . . . . . . .310 Зачем нужен PyMailGUI? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .314 Запуск PyMailGUI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .316 Стратегия представления . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .317 Основные изменения в PyMailGUI . . . . . . . . . . . . . . . . . . . . . . . . . . .318 Новое в версиях 2.1 и 2.0 (третье издание) . . . . . . . . . . . . . . . . . .318 Новое в версии 3.0 (четвертое издание) . . . . . . . . . . . . . . . . . . . . .320 Демонстрация PyMailGUI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .330 Запуск . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .331 Загрузка почты . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .338 Многопоточная модель выполнения . . . . . . . . . . . . . . . . . . . . . . .339 Интерфейс загрузки с сервера . . . . . . . . . . . . . . . . . . . . . . . . . . . .343 Обработка без подключения к Интернету, сохранение и открытие . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .344 Отправка почты и вложений . . . . . . . . . . . . . . . . . . . . . . . . . . . . .347 Просмотр электронных писем и вложений . . . . . . . . . . . . . . . . .351 Ответ на сообщения, пересылка и особенности адресации . . . .359 Удаление сообщений . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .365 Номера POP-сообщений и синхронизация . . . . . . . . . . . . . . . . . .367 Обработка содержимого электронной почты в формате HTML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .369 Поддержка интернационализации содержимого . . . . . . . . . . . .371 Альтернативные конфигурации и учетные записи . . . . . . . . . .376 Многооконный интерфейс и сообщения о состоянии . . . . . . . . .377 Реализация PyMailGUI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .380 PyMailGUI: главный модуль . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .382 SharedNames: глобальные переменные программы . . . . . . . . . .385 ListWindows: окна со списками сообщений . . . . . . . . . . . . . . . . .387 ViewWindows: окна просмотра сообщений . . . . . . . . . . . . . . . . . .409 messagecache: менеджер кэша сообщений . . . . . . . . . . . . . . . . . .421 popuputil: диалоги общего назначения . . . . . . . . . . . . . . . . . . . . .425 wraplines: инструменты разбиения строк . . . . . . . . . . . . . . . . . . .427 html2text: извлечение текста из разметки HTML (прототип, предварительное знакомство) . . . . . . . . . . . . . . . . . .430 mailconfig: настройки пользователя . . . . . . . . . . . . . . . . . . . . . . .433 8 Оглавление textConfig: настройка окон редактора PyEdit . . . . . . . . . . . . . . .440 PyMailGUIHelp: текст справки и ее отображение . . . . . . . . . . . .440 altconfigs: настройка нескольких учетных записей . . . . . . . . . .444 Идеи по усовершенствованию . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .447 Глава 15. Сценарии на стороне сервера . . . . . . . . . . . . . . . . . . . . . .460 «До чего же запутанную паутину мы плетем…» . . . . . . . . . . . . . . . .460 Что такое серверный CGI-сценарий? . . . . . . . . . . . . . . . . . . . . . . . . .462 Притаившийся сценарий . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .462 Создание CGI-сценариев на языке Python . . . . . . . . . . . . . . . . . .464 Запуск примеров серверных сценариев . . . . . . . . . . . . . . . . . . . . . . .466 Выбор веб-сервера . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .467 Использование локального веб-сервера . . . . . . . . . . . . . . . . . . . .467 Корневая страница с примерами на стороне сервера . . . . . . . . .470 Просмотр примеров серверных сценариев и их вывода . . . . . . .471 Вверх к познанию CGI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .472 Первая веб-страница . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .472 Первый CGI-сценарий . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .479 Добавление картинок и создание таблиц . . . . . . . . . . . . . . . . . . .486 Добавление взаимодействия с пользователем . . . . . . . . . . . . . . .489 Табличная верстка форм . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .499 Добавление стандартных инструментов ввода . . . . . . . . . . . . . .506 Изменение размещения элементов формы ввода . . . . . . . . . . . . .510 Передача параметров в жестко определенных адресах URL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .513 Передача параметров в скрытых полях форм . . . . . . . . . . . . . . .516 Сохранение информации о состоянии в сценариях CGI . . . . . . . . .518 Параметры запроса в строке URL . . . . . . . . . . . . . . . . . . . . . . . . .520 Скрытые поля форм . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .521 HTTP «Cookies» . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .522 Базы данных на стороне сервера . . . . . . . . . . . . . . . . . . . . . . . . . .527 Расширения модели CGI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .528 Комбинирование приемов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .529 Переключатель «Hello World» . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .530 Проверка отсутствующих или недопустимых данных . . . . . . .538 Рефакторинг программного кода с целью облегчения его сопровождения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .540 Шаг 1: совместное использование объектов разными страницами – новая форма ввода . . . . . . . . . . . . . . . . . . . . . . . . . .542 Шаг 2: многократно используемая утилита имитации формы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .545 Шаг 3: объединим все вместе – новый сценарий ответа . . . . . . .549 Подробнее об экранировании HTML и URL . . . . . . . . . . . . . . . . . . .551 Оглавление 9 Соглашения по экранированию адресов URL . . . . . . . . . . . . . . .552 Инструменты Python для экранирования HTML и URL . . . . . .553 Экранирование разметки HTML . . . . . . . . . . . . . . . . . . . . . . . . . .554 Экранирование адресов URL . . . . . . . . . . . . . . . . . . . . . . . . . . . . .555 Экранирование адресов URL, встроенных в разметку HTML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .556 Передача файлов между клиентами и серверами . . . . . . . . . . . . . . .561 Отображение произвольных файлов сервера на стороне клиента . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .563 Выгрузка файлов клиента на сервер . . . . . . . . . . . . . . . . . . . . . . .571 Как же все-таки протолкнуть биты через Сеть . . . . . . . . . . . . . .583 Глава 16. Сервер PyMailCGI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .585 «Список дел на поездку в Чикаго» . . . . . . . . . . . . . . . . . . . . . . . . . . .585 Веб-сайт PyMailCGI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .586 Обзор реализации . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .586 Новое в версии для четвертого издания (версия 3.0) . . . . . . . . .590 Новое в версии для предыдущего издания (версия 2.0) . . . . . . .593 Обзорное представление программы . . . . . . . . . . . . . . . . . . . . . . .595 Опробование примеров из этой главы . . . . . . . . . . . . . . . . . . . . . .595 Корневая страница . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .598 Настройка PyMailCGI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .601 Отправка почты по SMTP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .602 Страница составления сообщений . . . . . . . . . . . . . . . . . . . . . . . . .602 Сценарий отправки почты . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .603 Страницы с сообщениями об ошибках . . . . . . . . . . . . . . . . . . . . .607 Единство внешнего вида . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .608 Использование сценария отправки почты без броузера . . . . . . .609 Чтение электронной почты по протоколу POP . . . . . . . . . . . . . . . . .611 Страница ввода пароля POP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .611 Страница выбора почты из списка . . . . . . . . . . . . . . . . . . . . . . . . .613 Передача информации о состоянии в параметрах URL-ссылки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .617 Протоколы защиты данных . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .620 Страница просмотра сообщений . . . . . . . . . . . . . . . . . . . . . . . . . .622 Передача информации о состоянии в скрытых полях форм HTML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .626 Экранирование текста сообщения и паролей в HTML . . . . . . . .628 Обработка загруженной почты . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .630 Ответ и пересылка . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .632 Удаление . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .633 Операция удаления и номера POP-сообщений. . . . . . . . . . . . . . .637 Вспомогательные модули . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .642