Содержание страницы
20.18. BaseHTTPServer – Базовый HTTP-сервер¶BaseHTTPServer – Basic HTTP server
Примечание
Модуль BaseHTTPServer был объединён с http.server в
Python 3. Инструмент 2to3 автоматически адаптирует импорты при
преобразовании исходного кода в Python 3.
Исходный код: Lib/BaseHTTPServer.py
Этот модуль определяет два класса для реализации HTTP-серверов (веб-серверов).
Обычно этот модуль не используется напрямую, а служит основой для создания
функционирующих веб-серверов. См. модули SimpleHTTPServer и
CGIHTTPServer.
Первый класс, HTTPServer, является подклассом SocketServer.TCPServer
и, следовательно, реализует интерфейс SocketServer.BaseServer.
Он создаёт HTTP-сокет и прослушивает его, передавая запросы
обработчику. Код для создания и запуска сервера выглядит так:
def run(server_class=BaseHTTPServer.HTTPServer,
handler_class=BaseHTTPServer.BaseHTTPRequestHandler):
server_address = ('', 8000)
httpd = server_class(server_address, handler_class)
httpd.serve_forever()
-
class
BaseHTTPServer.HTTPServer(server_address, RequestHandlerClass)¶ Этот класс расширяет класс
TCPServer, сохраняя адрес сервера в переменных экземпляра с именамиserver_nameиserver_port. Сервер доступен обработчику, обычно через переменную экземпляраserverобработчика.
-
class
BaseHTTPServer.BaseHTTPRequestHandler(request, client_address, server)¶ Этот класс используется для обработки HTTP-запросов, поступающих на сервер. Сам по себе он не может отвечать на реальные HTTP-запросы; его нужно подклассифицировать, чтобы обрабатывать каждый метод запроса (например, GET или POST).
BaseHTTPRequestHandlerпредоставляет ряд переменных класса и экземпляра, а также методы для использования подклассами.Обработчик разбирает запрос и заголовки, затем вызывает метод, соответствующий типу запроса. Имя метода формируется из запроса. Например, для метода запроса
SPAMбудет вызван методdo_SPAM()без аргументов. Вся соответствующая информация хранится в переменных экземпляра обработчика. Подклассам не нужно переопределять или расширять метод__init__().BaseHTTPRequestHandlerимеет следующие переменные экземпляра:-
client_address¶ Содержит кортеж вида
(host, port), относящийся к адресу клиента.
-
server¶ Содержит экземпляр сервера.
-
command¶ Содержит команду (тип запроса). Например,
'GET'.
-
path¶ Содержит путь запроса.
-
request_version¶ Содержит строку версии из запроса. Например,
'HTTP/1.0'.
-
headers¶ Содержит экземпляр класса, указанного классовой переменной
MessageClass. Этот экземпляр разбирает и управляет заголовками HTTP-запроса.
-
rfile¶ Содержит входной поток, находящийся в начале необязательных входных данных.
-
wfile¶ Содержит выходной поток для записи ответа обратно клиенту. При записи в этот поток необходимо строго соблюдать протокол HTTP.
BaseHTTPRequestHandlerимеет следующие переменные класса:-
server_version¶ Задаёт версию серверного программного обеспечения. Возможно, вы захотите переопределить это. Формат – несколько строк, разделённых пробелами, где каждая строка имеет вид имя[/версия]. Например,
'BaseHTTP/0.2'.
-
sys_version¶ Содержит версию системы Python в форме, пригодной для использования методом
version_stringи классовой переменнойserver_version. Например,'Python/1.4'.
-
error_message_format¶ Задает строку формата для построения ответа об ошибке клиенту. Она использует спецификаторы формата в круглых скобках с ключами, поэтому операнд формата должен быть словарем. Ключ code должен быть целым числом, указывающим числовое значение HTTP-кода ошибки. message должен быть строкой, содержащей (подробное) сообщение об ошибке о том, что произошло, а explain должен быть объяснением номера кода ошибки. Значения по умолчанию для message и explain можно найти в переменной класса responses.
-
error_content_type¶ Задаёт HTTP-заголовок Content-Type ответов об ошибках, отправляемых клиенту. Значение по умолчанию –
'text/html'.Новое в версии 2.6: Ранее тип содержимого всегда был
'text/html'.
-
protocol_version¶ Определяет версию HTTP-протокола, используемую в ответах. Если установлено в
'HTTP/1.1', сервер будет разрешать постоянные HTTP-соединения; однако сервер должен затем включать точный заголовокContent-Length(используяsend_header()) во все свои ответы клиентам. Для обратной совместимости по умолчанию используется'HTTP/1.0'.
-
MessageClass¶ Указывает класс, подобный
rfc822.Message, для разбора HTTP-заголовков. Обычно он не переопределяется и по умолчанию равенmimetools.Message.
-
responses¶ Эта переменная содержит отображение целочисленных кодов ошибок на кортежи из двух элементов, содержащие краткое и длинное сообщение. Например,
{code: (shortmessage, longmessage)}. Краткое сообщение обычно используется как ключ message в ответе об ошибке, а длинное сообщение как ключ explain (см. переменную классаerror_message_format).
Экземпляр
BaseHTTPRequestHandlerимеет следующие методы:-
handle()¶ Вызывает
handle_one_request()один раз (или, если включены постоянные соединения, несколько раз) для обработки входящих HTTP-запросов. Этот метод не требуется переопределять; вместо этого следует реализовать соответствующие методыdo_*().
-
handle_one_request()¶ Этот метод разбирает и направляет запрос соответствующему методу
do_*(). Его не требуется переопределять.
-
send_error(code[, message])¶ Отправляет и записывает в журнал полный ответ об ошибке клиенту. Числовой код указывает HTTP-код ошибки, с сообщением в качестве необязательного, более конкретного текста. Отправляется полный набор заголовков, за которым следует текст, составленный с использованием переменной класса
error_message_format. Тело будет пустым, если метод HEAD или код ответа является одним из следующих:1xx,204 No Content,205 Reset Content,304 Not Modified.
-
send_response(code[, message])¶ Отправляет заголовок ответа и записывает в журнал принятый запрос. Отправляется строка HTTP-ответа, за которой следуют заголовки Server и Date. Значения для этих двух заголовков берутся из методов
version_string()иdate_time_string()соответственно.
-
send_header(keyword, value)¶ Записывает указанный HTTP-заголовок в выходной поток. keyword задаёт ключевое слово заголовка, а value – его значение.
-
end_headers()¶ Отправляет пустую строку, сигнализирующую об окончании HTTP-заголовков в ответе.
-
log_request([code[, size]])¶ Записывает в журнал принятый (успешный) запрос. Параметр code должен задавать числовой код HTTP, связанный с ответом. Если размер ответа доступен, его следует передать как параметр size.
-
log_error(...)¶ Записывает в журнал ошибку, когда запрос не может быть выполнен. По умолчанию передаёт сообщение в
log_message(), поэтому принимает те же аргументы (format и дополнительные значения).
-
log_message(format, ...)¶ Записывает произвольное сообщение в
sys.stderr. Обычно этот метод переопределяют, чтобы создать собственные механизмы логирования ошибок. Аргумент format – это стандартная форматная строка в стиле printf, в которую дополнительные аргументыlog_message()подставляются в качестве входных данных для форматирования. IP-адрес клиента и текущая дата и время добавляются в начало каждого сообщения.
-
version_string()¶ Возвращает строку версии программного обеспечения сервера. Это комбинация переменных класса
server_versionиsys_version.
-
date_time_string([timestamp])¶ Возвращает дату и время, заданные временной меткой (которая должна быть в формате, возвращаемом
time.time()), отформатированные для заголовка сообщения. Если временная метка опущена, используется текущая дата и время.Результат выглядит как
'Sun, 06 Nov 1994 08:49:37 GMT'.Новое в версии 2.5: Параметр timestamp.
-
log_date_time_string()¶ Возвращает текущие дату и время, отформатированные для логирования.
-
address_string()¶ Возвращает адрес клиента, отформатированный для логирования. Для IP-адреса клиента выполняется поиск имени.
-
20.18.1. Дополнительные примеры¶More examples
Чтобы создать сервер, который работает не бесконечно, а до выполнения некоторого условия:
def run_while_true(server_class=BaseHTTPServer.HTTPServer,
handler_class=BaseHTTPServer.BaseHTTPRequestHandler):
"""
Предполагается, что keep_running() – это функция без аргументов, которая
проверяется в начале и после каждого запроса. Если её возвращаемое значение
истинно, сервер продолжает работу.
"""
server_address = ('', 8000)
httpd = server_class(server_address, handler_class)
while keep_running():
httpd.handle_request()
См. также
- Модуль
CGIHTTPServer Расширенный обработчик запросов, поддерживающий CGI-скрипты.
- Модуль
SimpleHTTPServer Базовый обработчик запросов, который ограничивает ответ файлами, находящимися в корне документа.