?
Анимация
JavaScript
|
Главная Библионтека 27.1.6 Отладка К сожалению, часто CGI-программа работает в командной строке и, при этом, ведет себя странно при запуске сервером. Существует как минимум одна причина, по которой Вам следует сначала попробовать запустить программу из командной строки: это позволит Вам исключить синтаксические ошибки. Если Ваша программа не содержит синтаксических ошибок и все же не работает, попробуйте использовать этот модуль (файл cgi.py) в качестве CGI-программы, чтобы исключить распространенные ошибки, связанные с установкой программы и настройкой сервера. Например, если файл cgi.py установлен в стандартном каталоге cgi-bin , Вы можете послать примерно следующий запрос из браузера: http: hostname/cgi-bin/cgi.py?name=Joe&addr=At+Home Если при этом Вы получаете ошибку 404 - сервер не может найти программу; вероятно, необходимо установить его в другой каталог. Если же Вы получаете другую ошибку (например, 500) - у Вас проблемы с установкой программы или настройкой сервера, которые необходимо устранить перед тем, как идти дальше. И, наконец, если Вы получили форматированный вывод переменных окружения и содержимого формы (в нашем примере это поле addr со значением At home и поле name со значением Joe) - файл cgi.py установлен правильно. Следующим шагом вызовите функцию test() модуля cgi из Вашей программы, то есть замените его код следующими двумя инструкциями: Для систем, отличных от UNIX, потребуется дополнительная настройка HTTP-сервера для того, чтобы он "знал", каким образом необходимо выполнять программы на языке Python. Если Ваша программа должна читать или записывать файлы, убедитесь, что пользователь, от имени которого запущен HTTP-сервер, имеет соответствующий доступ к каталогам и файлам. Следует также помнить, что значения переменных окружения пользователя, от имени которого будет выполняться программа (в том числе переменных PATH и PYTHONPATH) могут отличаться от тех, которые имеете Вы сами. Для того, чтобы импортировать модули из каталогов, которые не включены в пути поиска модулей по умолчанию, измените переменную sys.path перед тем, как импортировать другие модули. Например: import sys sys.path.insert(0, "/usr/home/joe/lib/python") Следует помнить, что поиск производится в каталогах в том порядке, в котором они следуют в списке sys.path. Таким образом, в приведенном примере поиск будет производиться сначала в /usr/home/joe/lib/python, а затем в путях по умолчанию. 27.2. urllib - чтение произвольных ресурсов по URL 363 import cgi cgi.testO Вы должны получить точно такой же результат, как и при обращении к cgi.py. Когда обычная программа на языке Python генерирует исключение, которое не обрабатывается, интерпретатор выводит информацию об исключении и прерывает выполнение. Однако вывод информации об исключении производится на стандартный поток ошибок (sys.stderr), который перенаправляется в log-файл сервера или вовсе игнорируется. Чтобы этого не происходило, Вы можете поместить в начало программы инструкцию import sys sys.stderr = sys.stdout или поместить основной текст программы в блок try ... except и самостоятельно выводить информацию об исключении, например: import cgi print Content-Type: text/html\n try: # Основной текст CGI-программы except: cgi.print exception(limit=10) 27.2 urllib - чтение произвольных ресурсов по URL Этот модуль предоставляет средства высокого уровня для чтения сетевых ресурсов, используя различные протоколы. В частности функция urlopen() ведет себя аналогично встроенной функции open(), но воспринимает URL (Uniform Resource Locator, единообразный указатель ресурса) вместо имени файла. При этом, естественно, налагаются некоторые ограничения: Вы можете открыть ресурс только для чтения и полученный "файловый" объект не имеет метода seek(). Определенные в этом модуле средства позволяют обращаться к ресурсам через proxy-сервер, не требующий аутентификации. Если proxy-сервера не указаны явно, они определяются через переменные окружения, системный реестр (Windows) или Internet Config (Macintosh). В операционных системах UNIX для использования proxy необходимо перед запуском интерпретатора установить переменные окружения (регистр букв имен переменных может быть произвольным) http proxy, ftp proxy и gopher proxy равными URL, указывающим на proxy-сервера для соответствующих протоколов. 2В текущих реализациях модуля кэширование по умолчанию отключено, так как еще не реализован механизм проверки срока хранения копий ресурсов. urlopen(url [, data]) Создает и возвращает объект, реализующий чтение ресурса url. Если URL не содержит идентификатора протокола (scheme identifier) или в качестве идентификатора используется file, открывается локальный файл. В остальных случаях открывается сетевое соединение. Если соединение не может быть установлено или сервер сообщает об ошибке, генерируется исключение IOError. По умолчанию для протокола HTTP используется метод GET. Для того, чтобы использовался метод POST, необходимо указать аргумент data с данными в формате application/x-www-form-urlencoded (см. описание функции urlencode() ниже). urlretrieve (url [, filename [, reporthook [, data]]]) Копирует ресурс url в локальный файл. Если URL указывает на локальный файл или кэш уже содержит свежую копию ресурса, копирование не производится. Функция возвращает кортеж вида ( filename, headers) , где filename - имя локального файла с копией ресурса и headers - None, если url ссылается на локальный файл, иначе - объект, возвращаемый методом info() объекта, реализующего чтение ресурса. Аргумент filename указывает имя локального файла, в который будет производиться копирование. По умолчанию имя файла генерируется с помощью функции tempfile.mktempO . Задав аргумент reporthook Вы можете отслеживать процесс копирования. Функция (или другой объект, поддерживающий вызов) reporthook вызывается при установлении сетевого соединения и после загрузки каждого блока ресурса с тремя аргументами: число загруженных блоков, размер блока в байтах и размер файла (-1, если размер неизвестен). Аргумент data имеет такое же значение, как и для функции urlopen() . urlcleanup() Очищает кэш, созданный предыдущими вызовами функции urlretrieve() 2. quote (string [, safe]) Заменяет специальные символы в строке string на последовательности вида %xx и возвращает результат. Преобразованию никогда не подвергаются буквы, цифры и символы . и Аргумент safe указывает дополнительные символы, которые должны быть оставлены без изменений; по умолчанию он равен quote plus (string [, safe]) Работает аналогично функции quote() , но также заменят пробелы на + , как это необходимо для обработки значений полей форм. Если символ + не содержится в строке safe, то он заменяется на %2b . unquote( string) Заменяет специальные последовательности вида %xx на соответствующие символы и возвращает результат. 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 [ 115 ] 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 |