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()
См. также
-
ModuleCGIHTTPServer -
Расширенный обработчик запросов, поддерживающий CGI-скрипты.
-
ModuleSimpleHTTPServer -
Базовый обработчик запросов, ограничивающий ответ файлами, фактически находящимися в корневом каталоге документа.
© 2001–2020 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/2.7/library/basehttpserver.html