Spec-Zone.ru › Python 2.7

BaseHTTPServer — Базовый HTTP-сервер

Примечание

Модуль 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

Указывает заголовок Content-Type HTTP для ответов об ошибках, отправляемых клиенту. Значение по умолчанию — '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)}. shortmessage обычно используется в качестве ключа message в ответе об ошибке, а longmessage — в качестве ключа explain (см. переменную класса error_message_format).

Экземпляр BaseHTTPRequestHandler имеет следующие методы:

handle()

Вызывает handle_one_request() один раз (или, если включены поддерживаемые соединения, несколько раз) для обработки входящих HTTP-запросов. Вы никогда не должны его переопределять; вместо этого реализуйте соответствующие методы do_*().

handle_one_request()

Этот метод проанализирует и распределит запрос на соответствующий метод do_*(). Вы никогда не должны его переопределять.

send_error(code[, message])

Отправляет и регистрирует полный ответ об ошибке клиенту. Числовое значение code указывает код ошибки HTTP, а message — необязательный, более конкретный текст. Отправляется полный набор заголовков, за которым следует текст, составленный с использованием переменной класса 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])

Возвращает дату и время, заданные параметром timestamp (который должен быть в формате, возвращаемом функцией time.time()), отформатированным для заголовка сообщения. Если timestamp опущен, используется текущая дата и время.

Результат выглядит примерно так: 'Sun, 06 Nov 1994 08:49:37 GMT'.

Введено в версии 2.5: Параметр timestamp.

log_date_time_string()

Возвращает текущую дату и время, отформатированное для ведения журнала.

address_string()

Возвращает адрес клиента, отформатированный для ведения журнала. Производится поиск имени по IP-адресу клиента.

1. Дополнительные примеры

Чтобы создать сервер, который работает не бесконечно, а до тех пор, пока выполняется какое-либо условие:

def run_while_true(server_class=BaseHTTPServer.HTTPServer,
                   handler_class=BaseHTTPServer.BaseHTTPRequestHandler):
    """
    This assumes that keep_running() is a function of no arguments which
    is tested initially and after each request.  If its return value
    is true, the server continues.
    """
    server_address = ('', 8000)
    httpd = server_class(server_address, handler_class)
    while keep_running():
        httpd.handle_request()

См. также

Module CGIHTTPServer

Расширенный обработчик запросов, поддерживающий CGI-скрипты.

Module SimpleHTTPServer

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

© 2001–2020 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/2.7/library/basehttpserver.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API