basehttpserver.md
1> **Источник:** https://python-all.ru/2.7/library/basehttpserver.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 20.18. [`BaseHTTPServer`](https://python-all.ru/2.7/library/basehttpserver.html#module-BaseHTTPServer) – Базовый HTTP-сервер89> **Примечание**10>11> Модуль [`BaseHTTPServer`](https://python-all.ru/2.7/library/basehttpserver.html#module-BaseHTTPServer) был объединён с `http.server` в Python 3. Инструмент [2to3](https://python-all.ru/2.7/glossary.html#term-2to3) автоматически адаптирует импорты при преобразовании исходного кода в Python 3.1213**Исходный код:** [Lib/BaseHTTPServer.py](https://python-all.ru/src/2.7/Lib/BaseHTTPServer.py)1415---1617Этот модуль определяет два класса для реализации HTTP-серверов (веб-серверов). Обычно этот модуль не используется напрямую, а служит основой для создания функционирующих веб-серверов. См. модули [`SimpleHTTPServer`](https://python-all.ru/2.7/library/simplehttpserver.html#module-SimpleHTTPServer) и [`CGIHTTPServer`](https://python-all.ru/2.7/library/cgihttpserver.html#module-CGIHTTPServer).1819Первый класс, [`HTTPServer`](https://python-all.ru/2.7/library/basehttpserver.html#BaseHTTPServer.HTTPServer), является подклассом [`SocketServer.TCPServer`](https://python-all.ru/2.7/library/socketserver.html#SocketServer.TCPServer) и, следовательно, реализует интерфейс [`SocketServer.BaseServer`](https://python-all.ru/2.7/library/socketserver.html#SocketServer.BaseServer). Он создаёт HTTP-сокет и прослушивает его, передавая запросы обработчику. Код для создания и запуска сервера выглядит так:2021```python22def run(server_class=BaseHTTPServer.HTTPServer,23 handler_class=BaseHTTPServer.BaseHTTPRequestHandler):24 server_address = ('', 8000)25 httpd = server_class(server_address, handler_class)26 httpd.serve_forever()27```2829#### `class BaseHTTPServer.HTTPServer(server_address, RequestHandlerClass)`3031Этот класс расширяет класс `TCPServer`, сохраняя адрес сервера в переменных экземпляра с именами `server_name` и `server_port`. Сервер доступен обработчику, обычно через переменную экземпляра `server` обработчика.3233#### `class BaseHTTPServer.BaseHTTPRequestHandler(request, client_address, server)`3435Этот класс используется для обработки HTTP-запросов, поступающих на сервер. Сам по себе он не может отвечать на реальные HTTP-запросы; его нужно подклассифицировать, чтобы обрабатывать каждый метод запроса (например, GET или POST). [`BaseHTTPRequestHandler`](https://python-all.ru/2.7/library/basehttpserver.html#BaseHTTPServer.BaseHTTPRequestHandler) предоставляет ряд переменных класса и экземпляра, а также методы для использования подклассами.3637Обработчик разбирает запрос и заголовки, затем вызывает метод, соответствующий типу запроса. Имя метода формируется из запроса. Например, для метода запроса `SPAM` будет вызван метод `do_SPAM()` без аргументов. Вся соответствующая информация хранится в переменных экземпляра обработчика. Подклассам не нужно переопределять или расширять метод [`__init__()`](https://python-all.ru/2.7/reference/datamodel.html#object.__init__).3839[`BaseHTTPRequestHandler`](https://python-all.ru/2.7/library/basehttpserver.html#BaseHTTPServer.BaseHTTPRequestHandler) имеет следующие переменные экземпляра:4041#### `client_address`4243Содержит кортеж вида `(host, port)`, относящийся к адресу клиента.4445#### `server`4647Содержит экземпляр сервера.4849#### `command`5051Содержит команду (тип запроса). Например, `'GET'`.5253#### `path`5455Содержит путь запроса.5657#### `request_version`5859Содержит строку версии из запроса. Например, `'HTTP/1.0'`.6061#### `headers`6263Содержит экземпляр класса, указанного классовой переменной [`MessageClass`](https://python-all.ru/2.7/library/basehttpserver.html#BaseHTTPServer.BaseHTTPRequestHandler.MessageClass). Этот экземпляр разбирает и управляет заголовками HTTP-запроса.6465#### `rfile`6667Содержит входной поток, находящийся в начале необязательных входных данных.6869#### `wfile`7071Содержит выходной поток для записи ответа обратно клиенту. При записи в этот поток необходимо строго соблюдать протокол HTTP.7273[`BaseHTTPRequestHandler`](https://python-all.ru/2.7/library/basehttpserver.html#BaseHTTPServer.BaseHTTPRequestHandler) имеет следующие переменные класса:7475#### `server_version`7677Задаёт версию серверного программного обеспечения. Возможно, вы захотите переопределить это. Формат – несколько строк, разделённых пробелами, где каждая строка имеет вид имя\[/версия\]. Например, `'BaseHTTP/0.2'`.7879#### `sys_version`8081Содержит версию системы Python в форме, пригодной для использования методом [`version_string`](https://python-all.ru/2.7/library/basehttpserver.html#BaseHTTPServer.BaseHTTPRequestHandler.version_string) и классовой переменной [`server_version`](https://python-all.ru/2.7/library/basehttpserver.html#BaseHTTPServer.BaseHTTPRequestHandler.server_version). Например, `'Python/1.4'`.8283#### `error_message_format`8485Задает строку формата для построения ответа об ошибке клиенту. Она использует спецификаторы формата в круглых скобках с ключами, поэтому операнд формата должен быть словарем. Ключ *code* должен быть целым числом, указывающим числовое значение HTTP-кода ошибки. *message* должен быть строкой, содержащей (подробное) сообщение об ошибке о том, что произошло, а *explain* должен быть объяснением номера кода ошибки. Значения по умолчанию для *message* и *explain* можно найти в переменной класса *responses*.8687#### `error_content_type`8889Задаёт HTTP-заголовок Content-Type ответов об ошибках, отправляемых клиенту. Значение по умолчанию – `'text/html'`.9091Новое в версии 2.6: Ранее тип содержимого всегда был `'text/html'`.9293#### `protocol_version`9495Определяет версию HTTP-протокола, используемую в ответах. Если установлено в `'HTTP/1.1'`, сервер будет разрешать постоянные HTTP-соединения; однако сервер *должен* затем включать точный заголовок `Content-Length` (используя [`send_header()`](https://python-all.ru/2.7/library/basehttpserver.html#BaseHTTPServer.BaseHTTPRequestHandler.send_header)) во все свои ответы клиентам. Для обратной совместимости по умолчанию используется `'HTTP/1.0'`.9697#### `MessageClass`9899Указывает класс, подобный [`rfc822.Message`](https://python-all.ru/2.7/library/rfc822.html#rfc822.Message), для разбора HTTP-заголовков. Обычно он не переопределяется и по умолчанию равен [`mimetools.Message`](https://python-all.ru/2.7/library/mimetools.html#mimetools.Message).100101#### `responses`102103Эта переменная содержит отображение целочисленных кодов ошибок на кортежи из двух элементов, содержащие краткое и длинное сообщение. Например, `{code: (shortmessage, longmessage)}`. *Краткое сообщение* обычно используется как ключ *message* в ответе об ошибке, а *длинное сообщение* как ключ *explain* (см. переменную класса [`error_message_format`](https://python-all.ru/2.7/library/basehttpserver.html#BaseHTTPServer.BaseHTTPRequestHandler.error_message_format)).104105Экземпляр [`BaseHTTPRequestHandler`](https://python-all.ru/2.7/library/basehttpserver.html#BaseHTTPServer.BaseHTTPRequestHandler) имеет следующие методы:106107#### `handle()`108109Вызывает [`handle_one_request()`](https://python-all.ru/2.7/library/basehttpserver.html#BaseHTTPServer.BaseHTTPRequestHandler.handle_one_request) один раз (или, если включены постоянные соединения, несколько раз) для обработки входящих HTTP-запросов. Этот метод не требуется переопределять; вместо этого следует реализовать соответствующие методы `do_*()` .110111#### `handle_one_request()`112113Этот метод разбирает и направляет запрос соответствующему методу `do_*()`. Его не требуется переопределять.114115#### `send_error(code[, message])`116117Отправляет и записывает в журнал полный ответ об ошибке клиенту. Числовой *код* указывает HTTP-код ошибки, с *сообщением* в качестве необязательного, более конкретного текста. Отправляется полный набор заголовков, за которым следует текст, составленный с использованием переменной класса [`error_message_format`](https://python-all.ru/2.7/library/basehttpserver.html#BaseHTTPServer.BaseHTTPRequestHandler.error_message_format). Тело будет пустым, если метод HEAD или код ответа является одним из следующих: `1xx`, `204 No Content`, `205 Reset Content`, `304 Not Modified`.118119#### `send_response(code[, message])`120121Отправляет заголовок ответа и записывает в журнал принятый запрос. Отправляется строка HTTP-ответа, за которой следуют заголовки *Server* и *Date*. Значения для этих двух заголовков берутся из методов [`version_string()`](https://python-all.ru/2.7/library/basehttpserver.html#BaseHTTPServer.BaseHTTPRequestHandler.version_string) и [`date_time_string()`](https://python-all.ru/2.7/library/basehttpserver.html#BaseHTTPServer.BaseHTTPRequestHandler.date_time_string) соответственно.122123#### `send_header(keyword, value)`124125Записывает указанный HTTP-заголовок в выходной поток. *keyword* задаёт ключевое слово заголовка, а *value* – его значение.126127#### `end_headers()`128129Отправляет пустую строку, сигнализирующую об окончании HTTP-заголовков в ответе.130131#### `log_request([code[, size]])`132133Записывает в журнал принятый (успешный) запрос. Параметр *code* должен задавать числовой код HTTP, связанный с ответом. Если размер ответа доступен, его следует передать как параметр *size*.134135#### `log_error(...)`136137Записывает в журнал ошибку, когда запрос не может быть выполнен. По умолчанию передаёт сообщение в [`log_message()`](https://python-all.ru/2.7/library/basehttpserver.html#BaseHTTPServer.BaseHTTPRequestHandler.log_message), поэтому принимает те же аргументы (*format* и дополнительные значения).138139#### `log_message(format, ...)`140141Записывает произвольное сообщение в `sys.stderr`. Обычно этот метод переопределяют, чтобы создать собственные механизмы логирования ошибок. Аргумент *format* – это стандартная форматная строка в стиле printf, в которую дополнительные аргументы [`log_message()`](https://python-all.ru/2.7/library/basehttpserver.html#BaseHTTPServer.BaseHTTPRequestHandler.log_message) подставляются в качестве входных данных для форматирования. IP-адрес клиента и текущая дата и время добавляются в начало каждого сообщения.142143#### `version_string()`144145Возвращает строку версии программного обеспечения сервера. Это комбинация переменных класса [`server_version`](https://python-all.ru/2.7/library/basehttpserver.html#BaseHTTPServer.BaseHTTPRequestHandler.server_version) и [`sys_version`](https://python-all.ru/2.7/library/basehttpserver.html#BaseHTTPServer.BaseHTTPRequestHandler.sys_version).146147#### `date_time_string([timestamp])`148149Возвращает дату и время, заданные *временной меткой* (которая должна быть в формате, возвращаемом [`time.time()`](https://python-all.ru/2.7/library/time.html#time.time)), отформатированные для заголовка сообщения. Если *временная метка* опущена, используется текущая дата и время.150151Результат выглядит как `'Sun, 06 Nov 1994 08:49:37 GMT'`.152153Новое в версии 2.5: Параметр *timestamp*.154155#### `log_date_time_string()`156157Возвращает текущие дату и время, отформатированные для логирования.158159#### `address_string()`160161Возвращает адрес клиента, отформатированный для логирования. Для IP-адреса клиента выполняется поиск имени.162163## 20.18.1. Дополнительные примеры164165Чтобы создать сервер, который работает не бесконечно, а до выполнения некоторого условия:166167```python168def run_while_true(server_class=BaseHTTPServer.HTTPServer,169 handler_class=BaseHTTPServer.BaseHTTPRequestHandler):170 """171 Предполагается, что keep_running() – это функция без аргументов, которая172 проверяется в начале и после каждого запроса. Если её возвращаемое значение173 истинно, сервер продолжает работу.174 """175 server_address = ('', 8000)176 httpd = server_class(server_address, handler_class)177 while keep_running():178 httpd.handle_request()179```180181> **См. также**182>183> **Модуль [`CGIHTTPServer`](https://python-all.ru/2.7/library/cgihttpserver.html#module-CGIHTTPServer)**184>185> Расширенный обработчик запросов, поддерживающий CGI-скрипты.186>187> **Модуль [`SimpleHTTPServer`](https://python-all.ru/2.7/library/simplehttpserver.html#module-SimpleHTTPServer)**188>189> Базовый обработчик запросов, который ограничивает ответ файлами, находящимися в корне документа.190