Документация Python неофициальный перевод
Содержание страницы

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

Базовый обработчик запросов, который ограничивает ответ файлами, находящимися в корне документа.