Веб-сайт PyMailCGI

veb sajt pymailcgi Сервер PyMailCGI

В главе 14 мы создали программу под названием PyMailGUI, в которой с помощью Python+tkinter был реализован законченный почтовый клиент с графическим интерфейсом (если вы не читали соответствующую главу, вы можете бегло просмотреть ее сейчас). Здесь мы собираемся сделать нечто в том же роде, но в Веб: представленная в данном разделе система PyMailCGI является совокупностью сценариев CGI, реализующих простой веб-интерфейс для отправки и чтения электронной почты в любом броузере. В результате мы получим веб-приложение электронной почты — пусть оно и не такое мощное, как можно встретить у провайдеров услуг Интернета (ISP), но возможность вносить в него изменения дает вам полный контроль над его возможностями и дальнейшим развитием.

При изучении этой системы наша задача отчасти состоит в том, чтобы научиться еще нескольким приемам CGI, отчасти — в том, чтобы получить некоторые сведения о проектировании крупных систем Python в целом, и частично — в том, чтобы проанализировать соотношение преимуществ и недостатков между веб-приложениями (PyMailCGI) и обычными приложениями, разработанными для выполнения на локальном компьютере (PyMailGUI). Мы будем проводить сравнение приложений по мере продвижения по главе, а после знакомства со всей системой вернемся к нему для более глубокого рассмотрения.

Обзор реализации

На самом верхнем уровне PyMailCGI разрешает пользователям просматривать входящую почту с помощью интерфейса POP и отправлять новую почту по протоколу SMTP. Пользователям также предоставлена возможность составить ответ, переслать или удалить входящую почту во время ее просмотра. В данной реализации отправить электронное письмо с сайта PyMailCGI может всякий, но для просмотра почты, как правило, нужно установить PyMailCGI на своем собственном локальном компьютере или на сайте вместе с информацией о своем собственном почтовом сервере (из-за соображений безопасности, излагаемых ниже).

Просмотр и отправка почты выглядят достаточно просто, и мы уже несколько раз реализовывали эти возможности. Но в процессе взаимодей
ствия участвует несколько отдельных страниц, для каждой из которых требуется отдельный сценарий CGI или файл HTML. На самом деле PyMailCGI представляет собой довольно ли ней ную систему — в самом сложном варианте схемы взаимодействия с пользователем взаимодействие проходит от начала до конца шесть состояний (и потому создано шесть веб-страниц). Так как каждая страница в мире CGI обычно генерируется отдельным файлом, это предполагает также наличие шести файлов с исходным программным кодом.

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

Чтобы помочь уследить за тем, как все файлы PyMailCGI вписываются в общую систему, перед началом практического программирования я написал файл, представленный в примере 16.1. В нем сделан неформальный набросок прохождения пользователя через систему и вызываемых при этом файлов. Разумеется, для описания передачи управления и информации через состояния можно использовать более формальные обозначения, такие как веб-страницы (например, диаграммы потоков данных), но для данного простого примера этого файла достаточно.

Пример 16.1. PP4E\Internet\Web\PyMailCgi\pageflow.txt

файл или сценарий создает

подпись: главная страница
ввод пароля
список (загружает всю почту)
npocmqtp+bn6op=del|reply|fwd
(загрузка)
редактор или удалить+
подтвердить (del)
подтверждение (отправка почты) странице
редактор
подтверждение (отправка почты)
[pymailcgi.html]

=> [onRootViewLink.py]

=> [onViewPswdSubmit.py]

=> [onViewListLink.py]

=> [onViewPageAction.py]

=> [onEditPageSend.py]

=> обратно к главной

=> [onRootSendLink.py]

=> [onEditPageSend.py]

=> обратно к главной странице

В этом файле просто перечислены все файлы с исходными текстами системы, где запускаемые ими сценарии отмечены символами => и отступами.

Например, ссылки на главной странице pymailcgi.html вызывают сценарии onRootViewLink.py и onRootSendLink.py. Сценарий onRootView- Link.py создает страницу для ввода пароля, нажатие на кнопку Submit (Отправить) запускает onViewPswdSubmit.py и так далее. Обратите внимание, что оба действия, просмотр и отправка почты, могут заканчиваться запуском сценария onSendSubmit.py для отправки новой почты — операции просмотра попадают в этот сценарий, если пользователь решит ответить на входящую почту или переслать ее.

В такой системе отдельные сценарии CGI несут немного смысла, поэтому полезно помнить общую взаимосвязь страниц. Обращайтесь к этому файлу, если потеряете нить изложения. Дополнительно обстановку проясняет рис. 16.1, на котором представлено общее содержание этого сайта при просмотре структуры каталогов в окне оболочки Cygwin в Windows.

Рис. 16.1. Содержание PyMailCgi

 

Все файлы, которые вы здесь видите, были выгружены в ходе установки сайта в подкаталог PyMailCgi, находящийся в корневом веб-каталоге на сервере. Помимо файлов страниц HTML и сценариев CGI, вызываемых в ответ на действия пользователя, в PyMailCGI используется также несколько вспомогательных модулей:

commonhtml.py

Служит библиотекой инструментов HTML.

externs.py

Объединяет в себе доступ к модулям, импортируемым из других систем.

loadmail.py

Инкапсулирует загрузку из почтового ящика для расширения в будущем.

secret.py

Реализует шифрование пароля с возможностью настройки.

PyMailCGI также повторно использует части пакета mailtools и модуля mailconfig.py, созданных в главе 13. Первый из них доступен для импорта из корневого каталога PP4E пакета примеров, а второй является локальной версией, скопированной в каталог PyMailCgi, вследствие чего реализация этого модуля для PyMailGUI и PyMailCGI может отличаться. Модуль externs.py предназначен для сокрытия особенностей размещения модулей, на случай, если будет выбрана иная структура каталогов установки.

Эта система вновь демонстрирует практические выгоды повторного использования программного кода. Версия системы в этом издании импортирует значительный объем логики из нового пакета mailtools, представленного в главе 13, — загрузку сообщений, отправку, удаление, анализ, составление, кодирование и декодирование и добавление вложений — несмотря на то, что первоначально модули этого пакета разрабатывались для программы PyMailGUI. Когда позднее пришло время обновить PyMailCGI, инструменты для выполнения сложных операций, таких как добавление вложений и поиск текста в сообщениях, уже были готовы. Исходные тексты пакета mailtools вы найдете в главе 13.

Как обычно, PyMailCGI использует также ряд модулей из стандартной библиотеки Python: smtplib, poplib, email.*, cgi, urllib.* и другие. Благодаря повторному использованию нашего собственного и стандартного программного кода эта система позволяет сделать много минимальным объемом программного кода. В общей сложности PyMailCGI содержит всего 846 строк нового программного кода, включая пробельные строки, комментарии и главный файл HTML (более подробная информация приводится в файле linecounts.xls, в исходном каталоге системы; версия в предыдущем издании содержала около 835 новых строк).

Сравнение размеров говорит не в пользу «настольного» клиентского приложения PyMailGUI из главы 14, но различия в значительной степени объясняются более ограниченными функциональными возможностями PyMailCGI — здесь не используются локальные файлы для сохранения почты, не предусматривается перекрытие во времени потоков выполнения операций передачи, не предусматривается кэширование сообщений, не проверяется и не восстанавливается синхронизация с ящиком входящих сообщений, не предусматривается возможность выбора нескольких сообщений, отсутствует возможность просмотра исходного текста сообщений и так далее. Кроме того, как рассказывается в следующем разделе, в этой версии PyMailCGI используется более ограниченная политика работы с Юникодом, и, хотя просматривать можно любые вложения, отправка двоичных и некоторых текстовых вложений не поддерживается в текущей версии из-за проблем в Python 3.1.

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

Использованная литература:

Марк Лутц — Программирование на Python, 4-е издание, II том, 2011

Каталог сайтов Всего.ру
Оцените статью
Секреты программирования
Добавить комментарий