справочник по Python. мм isbn 9785932861578 9 785932 861578
Скачать 4.21 Mb.
|
Ошибка!Код: %(code)d. Текст: %(message)s. Описание: %(code)s = %(explain)s. 634 Глава 22. Разработка интернет-приложений в журнал вызывается метод log_error(). Этот метод создает законченный ответ с сообщением об ошибке, используя строку формата в атрибуте клас- са error_message_format, и отправляет ее клиенту. Затем он закрывает соеди- он закрывает соеди- он закрывает соеди- закрывает соеди- закрывает соеди- соеди- соеди- нение. После вызова этого метода не должно выполняться никаких других операций. b.send_response(code [, message]) Отправляет ответ в случае успешной обработки запроса. Отправляет стро- стро- стро- ку с ответом HTTP, за которой следуют заголовки Server и Date. В аргумен- В аргумен- аргумен- аргумен- те code передается числовой код ответа HTTP, а в аргументе message – до- до- полнительное сообщение. Для записи запроса в журнал вызывается метод log_request() b.send_header(keyword, value) Выводит заголовок HTTP в выходной поток. В аргументе keyword переда- ется имя заголовка, а в аргументе value – его значение. Этот метод должен вызываться только после вызова метода send_response(). b.end_headers() Отправляет пустую строку, как признак окончания последовательности заголовков HTTP. b.log_request([code [, size]]) Записывает в журнал успешно обработанный запрос. В аргументе code пе- редается код HTTP, а в аргументе size – размер ответа в байтах (если досту- пен). По умолчанию для журналирования вызывает метод log_message(). b.log_error(format, ...) Записывает в журнал сообщение об ошибке. По умолчанию для журнали- рования вызывает метод log_message(). b.log_message(format, ...) Выводит любые сообщения в поток sys.stderr. В аргументе format переда- ется строка формата, которая содержит спецификаторы для любых допол- нительных аргументов. В начало каждого сообщения вставляются адрес клиента и текущее время. Ниже приводится пример сервера HTTP, который выполняется в отдель- HTTP, который выполняется в отдель- , который выполняется в отдель- ном потоке управления и может контролироваться с помощью словаря, ключи в котором интерпретируются как пути к документам. try: from http.server import BaseHTTPRequestHandler, HTTPServer # Py 3 except ImportError: from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer # Py 2 ёёё class DictRequestHandler(BaseHTTPRequestHandler): def __init__(self,thedict,*args,**kwargs): self.thedict = thedict BaseHTTPRequestHandler.__init__(self,*args,**kwargs) ёёё def do_GET(self): key = self.path[1:] # Отбросить ведущий символ ‘/’ Пакет http 635 if not key in self.thedict: self.send_error(404, “No such key”) else: self.send_response(200) self.send_header(‘content-type’,’text/plain’) self.end_headers() resp = “Key : %s\n” % key resp += “Value: %s\n” % self.thedict[key] self.wfile.write(resp.encode(‘latin-1’)) ёёё # Пример использования d = { ‘name’ : ‘Dave’, ‘values’ : [1,2,3,4,5], ‘email’ : ‘dave@dabeaz.com’ } from functools import partial serv = HTTPServer((“”,9000), partial(DictRequestHandler,d)) ёёё import threading d_mon = threading.Thread(target=serv.serve_forever) d_mon.start() Чтобы опробовать этот пример, запустите сервер и введите в броузере адрес URL, такой как http://localhost:9000/name или http://localhost:9000/values. Если все действует как надо, вы увидите в окне броузера содержимое словаря. Кроме всего прочего, этот пример иллюстрирует способ передачи класса обработчика с дополнительными параметрами, которые должны исполь- зоваться при создании экземпляра обработчика. Обычно серверы создают обработчики, используя предопределенный набор аргументов, которые передаются методу __init__(). Передать дополнительные аргументы можно с помощью функции functools.partial(), как показано в этом примере. Эта функция возвращает вызываемый объект, включающий дополнительный параметр, но сохраняет сигнатуру вызова, ожидаемую сервером. Модуль http.cookies обеспечивает возможность работы с блоками данных cookie на стороне сервера. В Python 2 этот модуль называется Cookie. Блоки данных cookie позволяют управлять состоянием веб-приложений, реализующих поддержку сеансов, аутентификации пользователей и обе- спечивающих прочие похожие возможности. Чтобы отправить блок дан- ных cookie броузеру пользователя, сервер HTTP обычно добавляет в ответ заголовок HTTP, как показано ниже: Set-Cookie: session=8273612; expires=Sun, 18-Feb-2001 15:00:00 GMT; \ path=/; domain=foo.bar.com Альтернативный вариант передачи cookie заключается в том, чтобы вне- cookie заключается в том, чтобы вне- заключается в том, чтобы вне- дрить код JavaScript в раздел style=”visibility:hidden; position:absolute; background-color:#ffffff;”> ACME Officials Quiet After Corruption ProbeToday, shares of ACME corporation ( 662 Глава 23. Веб-программирование onMouseOut=”HidePopup();”>ACME) plummetted by more than 75% after federal investigators revealed that the board of directors is the target of a corruption probe involving the Governor, state lottery officials, and the archbishop. Модуль cgi 663 Когда отправляется запрос к соответствующему сценарию CGI, веб-сервер запускает CGI-программу в отдельном дочернем процессе. Программы CGI получают входные данные из двух источников: из потока sys.stdin и из переменных окружения, устанавливаемых сервером. Ниже перечислены наиболее типичные переменные окружения, которые устанавливаются веб-сервером: Переменная Описание AUTH_TYPE Метод аутентификации CONTENT_LENGTH Длина переданных данных в sys.stdin CONTENT_TYPE Тип данных запроса DOCUMENT_ROOT Корневой каталог с документами GATEWAY_INTERFACE Строка с номером версии CGI HTTP_ACCEPT Типы MIME, принимаемые клиентом HTTP_COOKIE Хранилище значения cookie HTTP_FROM Адрес электронной почты клиента (часто отправка этой информации бывает запрещена) HTTP_REFERER Ссылающийся адрес URL HTTP_USER_AGENT Информация о броузере клиента PATH_INFO Дополнительная информация о пути PATH_TRANSLATED Преобразованная версия переменной PATH_INFO QUERY_STRING Строка запроса REMOTE_ADDR IP-адрес клиента REMOTE_HOST Имя хоста клиента REMOTE_IDENT Пользователь, выполнивший запрос REMOTE_USER Имя аутентифицированного пользователя REQUEST_METHOD Метод (‘GET’ или ‘POST’) SCRIPT_NAME Имя программы SERVER_NAME Имя хоста сервера SERVER_PORT Номер порта сервера SERVER_PROTOCOL Протокол сервера SERVER_SOFTWARE Название и версия серверного программного обеспечения Вывод программы CGI записывается в поток стандартного вывода sys.std- out . Технические подробности, касающиеся разработки CGI-сценариев, можно найти, например, в книге «CGI Programming with Perl, 2nd Edition», 1 1 Гундаварам Ш. «CGI-программирование на Perl, 2-е издание». – Пер с англ. – СПб.: Символ-Плюс, 2001. 664 Глава 23. Веб-программирование Шишира Гундаварама (Shishir Gundavaram) (O’Reilly, 2000). Нам же до- статочно знать два основных аспекта. Во-первых, содержимое формы HTML передается CGI-программе в виде текстовой последовательности, которая называется строкой запроса. В языке Python доступ к содержимому строки запроса осуществляется с помощью класса FieldStorage. Например: import cgi form = cgi.FieldStorage() name = form.getvalue(‘name’) # Получить содержимое поля ‘name’ формы email = form.getvalue(‘email’) # Получить содержимое поля ‘email’ формы Во-вторых, вывод CGI-программы делится на две части: заголовок HTTP и собственно данные (обычно в формате HTML). Эти две части всегда от- HTML). Эти две части всегда от- ). Эти две части всегда от- деляются друг от друга пустой строкой. Ниже показано, как производится вывод простого заголовка HTTP: print ‘Content-type: text/html\r’ # Данные будут выводиться в формате HTML print ‘\r’ # Пустая строка (обязательно!) Остальная часть вывода – это собственно данные. Например: print ‘’ print ‘ |