Новое в версии для предыдущего издания (версия 2.0)

novoe v versii dlya predydushhego izdaniya versiya 2 0 Сервер PyMailCGI

В третьем издании в веб-приложении PyMailCGI был задействован новый пакет mailtools, представленный в главе 13; применялся для шифрования паролей пакет PyCrypto — в случае если он установлен; добавлена поддержка просмотра и отправки вложений и была повышена эффективность выполнения. Все эти улучшения были унаследованы версией 3.0.

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

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

     Для от прав ки вложений используется прием выгрузки файлов, представленный в конце главы 15. Страницы редактирования сообщений теперь снабжены элементами управления выгрузкой файлов, что позволяет присоединять к письму до трех вложений. Выбранные файлы, как обычно, выгружаются броузером на сервер с оставшейся частью страницы, сохраняются во временных файлах на сервере и добавляются в исходящую почту из локальных файлов на сервере с помощью инструментов из пакета mailtools. Как описывалось во врезке в предыдущем разделе, версия 3.0 позволяет отправлять только текстовые вложения в совместимой кодировке, включая и файлы HTML, и не поддерживает двоичные вложения.

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

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

Но даже с этими улучшениями загрузка страницы со списком заголовков может выполняться довольно долго, при большом количестве входящих сообщений в почтовом ящике (как я уже признавался в главе 14, в одном из моих почтовых ящиков скопилось несколько тысяч писем). Более удачное решение заключалось бы в том, чтобы каким-то образом кэшировать почту, — для ограничения объема загружаемых данных хотя бы в течение сеанса работы с броузером. Например, можно было бы загружать заголовки только вновь прибывших сообщений и помещать в кэш заголовки, прочитанные ранее, как это сделано в клиенте PyMail- GUI в главе 14.

Однако из-за отсутствия встроенного механизма сохранения информации о состоянии в сценариях CGI для этого пришлось бы задействовать на стороне сервера базу данных того или иного вида. Мы могли бы, например, сохранять уже полученные заголовки под ключом, идентифицирующим сеанс (состоящим, например, из номера процесса и времени), и передавать эти ключи между страницами через cookies, скрытые поля форм или параметры запроса URL. Каждая страница могла бы использовать этот ключ для получения кэшированных данных непосредственно с веб-сервера, вместо того чтобы снова загружать их с почтового сервера. Загрузка данных из локального файла кэша наверняка выполнялась бы быстрее, чем загрузка с почтового сервера через сетевое соединение.

Дальнейшее расширение системы было бы для вас интересным упражнением, но обсуждение этого сильно увеличило бы объем этой главы (честно признаться, я уже исчерпал время и объем, отведенные на этот проект и на эту главу задолго до того, как стал задумываться о потенциальных расширениях).

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

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

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