Отладка сценариев CGI

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

Пере хват со обще ний об ошибках

Данный сценарий перенаправляет стандартный поток вывода sys. stderr в sys.stdout, чтобы сообщения интерпретатора об ошибках в конечном счете выводились на странице ответа в броузере. Обычно сообщения интерпретатора об ошибках выводятся в поток вывода stderr, в результате чего они выводятся в окно консоли на стороне сервера или в файл журнала. Чтобы направить их в броузер, нужно заставить stderr ссылаться на тот же самый объект файла, что и stdout (который в сценариях CGI соединяется с броузером). Если не сделать такого переназначения, сообщения об ошибках, в том числе сообщения о программных ошибках в сценарии, не появятся в броузере.

Имитация контрольных данных

Определение класса dummy, закомментированное в этой окончательной версии, использовалось для отладки сценария, перед тем как он был размещен в Сети. Помимо того, что сообщения, выводимые в поток вывода stderr, по умолчанию не видны, сценарии CGI также предполагают наличие окружающего контекста, которого нет при отладке их вне окружения CGI. Например, при запуске из командной строки системы этот сценарий не получает входные данные из формы. Раскомментируйте этот фрагмент для тестирования сценария из командной строки. Класс dummy маскируется под объект разобранных полей формы, и form получает значения словаря, содержащего два объекта полей формы. В итоге form подменяет результат вызова cgi.FieldStorage. Как обычно в Python, необходимо придерживаться лишь интерфейсов объектов, а не типов данных.

Ниже приводится несколько общих рекомендаций по отладке CGI-сценариев на сервере:

За пус кай те сце нарий из команд ной стро ки

Возможно, при этом не будет сгенерирована разметка HTML, но при автономном выполнении выявятся синтаксические ошибки в программном коде. Не забывайте, что в командной строке Python можно запускать файлы с исходным программным кодом независимо от их расширений: например, команда python somescript.cgi будет выполнена как обычно.

Пере на правляй те sys.stderr в sys.stdout как мож но бли же к на ча лу своего сце нария

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

Ими тируй те передачу вход ных дан ных для мо де лиро ва ния окружаю- ще го кон текста CGI

Например, определите классы, имитирующие интерфейс входных данных CGI (как это делает класс dummy в данном сценарии), чтобы посмотреть вывод сценария для разных контрольных примеров при запуске его из командной строки. Иногда также бывает полезно установить переменные окружения так, чтобы они имитировали данные формы или URL (далее в этой главе будет показан пример такого приема).

Вы зы вай те ути ли ты вы во да кон текста CGI в броузере

В модуле CGI имеются вспомогательные функции, посылающие в броузер форматированный дамп переменных окружения CGI и входных значений. Например, вызов cgi.print_form(form) выведет все параметры, отправленные клиентом, а вызов cgi.test() выведет значения переменных окружения, полей ввода формы, имя каталога и многое другое. Иногда этого оказывается достаточно для решения проблем, связанных с соединением или с входными данными. Некоторые из этих функций будут использованы в примере почтовой программы с веб-интерфейсом в следующей главе.

По ка зы вай те пере хва ты вае мые ис клю чи тель ные си туа ции

При перехвате возбужденной исключительной ситуации сообщение Python об ошибке по умолчанию не выводится в stderr. В таких случаях ваш сценарий решает, выводить ли имя исключения и его значение на странице ответа. Подробности, касающиеся исключения, могут быть получены с помощью функции sys.exc_info() из встроенного модуля sys. Кроме того, для получения трассировки стека вручную и вывода ее на страницу можно воспользоваться модулем traceback — трассировочная информация содержит номера строк в исходном программном коде, выполнявшихся в момент появления исключения. Это также будет использовано в реализации страницы с ошибками в примере PyMailCGI (глава 16).

До бав ляй те вы вод от ла доч ной ин форма ции

Вы всегда можете вставить в программный код CGI-сценария вызовы функции print для вывода отладочной информации, как в любую другую программу на языке Python. Однако вам следует убедиться, что строка заголовка «Content-type» выводится первой, иначе выводимая информация может не отображаться на странице. В самом тяжелом случае можно также выводить отладочные и трассировочные сообщения в локальный текстовый файл на сервере — при выводе в файл отпадает необходимость форматировать трассировочные сообщения в соответствии с соглашениями о выводе разметки HTML в поток ответа.

Опро буй те сце нарий в дей ст вии

Конечно, если ваш сценарий хоть как-то работает, лучше всего дать ему работать на сервере и пусть обрабатывает реальные данные от броузера. Запуск локального веб-сервера на вашем компьютере, как показано в данной главе, позволит быстрее вносить изменения и тестировать их.

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

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

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