http.server.md
1> **Источник:** https://python-all.ru/3.0/library/http.server.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# `http.server` – HTTP-серверы89Этот модуль определяет классы для реализации HTTP-серверов (веб-серверов).1011Один класс, [`HTTPServer`](https://python-all.ru/3.0/library/http.server.html#http.server.HTTPServer), является подклассом `socketserver.TCPServer`. Он создаёт HTTP-сокет и прослушивает его, направляя запросы обработчику. Код для создания и запуска сервера выглядит так:1213```python14def run(server_class=HTTPServer, handler_class=BaseHTTPRequestHandler):15 server_address = ('', 8000)16 httpd = server_class(server_address, handler_class)17 httpd.serve_forever()18```1920#### `[http.server.HTTPServer]class http.server.HTTPServer(server_address, RequestHandlerClass)`2122Этот класс расширяет класс2324`TCPServer`2526, сохраняя адрес сервера в переменных экземпляра с именами2728`server_name`2930и3132`server_port`3334. Сервер доступен обработчику, обычно через переменную экземпляра3536`server`3738обработчика.3940При создании экземпляра [`HTTPServer`](https://python-all.ru/3.0/library/http.server.html#http.server.HTTPServer) необходимо передать *RequestHandlerClass*, для которого этот модуль предоставляет три различных варианта:4142#### `[http.server.BaseHTTPRequestHandler]class http.server.BaseHTTPRequestHandler(request, client_address, server)`4344Этот класс используется для обработки HTTP-запросов, поступающих на сервер. Сам по себе он не может отвечать на реальные HTTP-запросы; его нужно наследовать, чтобы обрабатывать каждый метод запроса (например, GET или POST). [`BaseHTTPRequestHandler`](https://python-all.ru/3.0/library/http.server.html#http.server.BaseHTTPRequestHandler) предоставляет ряд переменных класса и экземпляра, а также методы для использования подклассами.4546Обработчик разбирает запрос и заголовки, затем вызывает метод, соответствующий типу запроса. Имя метода формируется из запроса. Например, для метода запроса `SPAM` будет вызван метод `do_SPAM()` без аргументов. Вся соответствующая информация хранится в переменных экземпляра обработчика. Подклассы не должны переопределять или расширять метод [`__init__()`](https://python-all.ru/3.0/reference/datamodel.html#object.__init__).4748[`BaseHTTPRequestHandler`](https://python-all.ru/3.0/library/http.server.html#http.server.BaseHTTPRequestHandler) имеет следующие переменные экземпляра:4950#### `[http.server.BaseHTTPRequestHandler.client_address]client_address`5152Содержит кортеж вида5354`(host, port)`5556, относящийся к адресу клиента.5758#### `[http.server.BaseHTTPRequestHandler.server]server`5960Содержит экземпляр сервера.6162#### `[http.server.BaseHTTPRequestHandler.command]command`6364Содержит команду (тип запроса). Например,6566`'GET'`6768.6970#### `[http.server.BaseHTTPRequestHandler.path]path`7172Содержит путь запроса.7374#### `[http.server.BaseHTTPRequestHandler.request_version]request_version`7576Содержит строку версии из запроса. Например,7778`'HTTP/1.0'`7980.8182#### `[http.server.BaseHTTPRequestHandler.headers]headers`8384Содержит экземпляр класса, указанного8586[`MessageClass`](https://python-all.ru/3.0/library/http.server.html#http.server.BaseHTTPRequestHandler.MessageClass)8788переменной класса. Этот экземпляр разбирает и управляет заголовками в HTTP- запросе.8990#### `[http.server.BaseHTTPRequestHandler.rfile]rfile`9192Содержит входной поток, находящийся в начале необязательных входных данных.9394#### `[http.server.BaseHTTPRequestHandler.wfile]wfile`9596Содержит выходной поток для записи ответа обратно клиенту. При записи в этот поток необходимо строго соблюдать протокол HTTP.9798[`BaseHTTPRequestHandler`](https://python-all.ru/3.0/library/http.server.html#http.server.BaseHTTPRequestHandler) имеет следующие переменные класса:99100#### `[http.server.BaseHTTPRequestHandler.server_version]server_version`101102Указывает версию серверного программного обеспечения. Возможно, потребуется переопределить это значение. Формат – несколько строк, разделённых пробелами, где каждая строка имеет вид имя\[/версия\]. Например,103104`'BaseHTTP/0.2'`105106.107108#### `[http.server.BaseHTTPRequestHandler.sys_version]sys_version`109110Содержит версию системы Python в форме, пригодной для использования методом111112[`version_string`](https://python-all.ru/3.0/library/http.server.html#http.server.BaseHTTPRequestHandler.version_string)113114и переменной класса115116[`server_version`](https://python-all.ru/3.0/library/http.server.html#http.server.BaseHTTPRequestHandler.server_version)117118. Например,119120`'Python/1.4'`121122.123124#### `[http.server.BaseHTTPRequestHandler.error_message_format]error_message_format`125126Задает строку формата для построения ответа об ошибке клиенту. Она использует спецификаторы формата в круглых скобках с ключами, поэтому операнд формата должен быть словарем. Ключ127128*code*129130должен быть целым числом, указывающим числовое значение HTTP-кода ошибки.131132*message*133134должен быть строкой, содержащей (подробное) сообщение об ошибке о том, что произошло, а135136*explain*137138должен быть объяснением номера кода ошибки. Значения по умолчанию для139140*message*141142и143144*explain*145146можно найти в переменной класса147148*responses*149150.151152#### `[http.server.BaseHTTPRequestHandler.error_content_type]error_content_type`153154Задаёт HTTP-заголовок Content-Type для ответов об ошибках, отправляемых клиенту. Значение по умолчанию:155156`'text/html'`157158.159160#### `[http.server.BaseHTTPRequestHandler.protocol_version]protocol_version`161162Задаёт версию протокола HTTP, используемую в ответах. Если установлено163164`'HTTP/1.1'`165166, сервер будет разрешать постоянные соединения; однако в этом случае сервер167168*должен*169170включать точный заголовок171172`Content-Length`173174(с помощью175176[`send_header()`](https://python-all.ru/3.0/library/http.server.html#http.server.BaseHTTPRequestHandler.send_header)177178) во все свои ответы клиентам. Для обратной совместимости по умолчанию используется179180`'HTTP/1.0'`181182.183184#### `[http.server.BaseHTTPRequestHandler.MessageClass]MessageClass`185186Задаёт класс, похожий на187188[`email.message.Message`](https://python-all.ru/3.0/library/email.message.html#email.message.Message)189190, для разбора HTTP-заголовков. Обычно его не переопределяют, и по умолчанию используется191192`http.client.HTTPMessage`193194.195196#### `[http.server.BaseHTTPRequestHandler.responses]responses`197198Эта переменная содержит отображение целочисленных кодов ошибок в кортежи из двух элементов, содержащие краткое и полное сообщения. Например,199200`{code: (shortmessage, longmessage)}`201202.203204*shortmessage*205206обычно используется как ключ207208*message*209210в ответе об ошибке, а211212*longmessage*213214– как ключ215216*explain*217218(см. переменную класса219220[`error_message_format`](https://python-all.ru/3.0/library/http.server.html#http.server.BaseHTTPRequestHandler.error_message_format)221222).223224Экземпляр [`BaseHTTPRequestHandler`](https://python-all.ru/3.0/library/http.server.html#http.server.BaseHTTPRequestHandler) имеет следующие методы:225226#### `[http.server.BaseHTTPRequestHandler.handle]handle()`227228Вызывает229230[`handle_one_request()`](https://python-all.ru/3.0/library/http.server.html#http.server.BaseHTTPRequestHandler.handle_one_request)231232один раз (или несколько, если включены постоянные соединения) для обработки входящих HTTP-запросов. Этот метод не нужно переопределять; вместо этого следует реализовать соответствующие методы233234`do_*()`235236.237238#### `[http.server.BaseHTTPRequestHandler.handle_one_request]handle_one_request()`239240Этот метод разбирает запрос и направляет его в соответствующий метод241242`do_*()`243244. Его не нужно переопределять.245246#### `[http.server.BaseHTTPRequestHandler.send_error]send_error(code[, message])`247248Отправляет и регистрирует полный ответ об ошибке клиенту. Числовой249250*code*251252задает HTTP-код ошибки, а253254*message*255256– необязательный, более конкретный текст. Отправляется полный набор заголовков, за которым следует текст, составленный с использованием переменной класса257258[`error_message_format`](https://python-all.ru/3.0/library/http.server.html#http.server.BaseHTTPRequestHandler.error_message_format)259260.261262#### `[http.server.BaseHTTPRequestHandler.send_response]send_response(code[, message])`263264Отправляет заголовок ответа и регистрирует принятый запрос. Отправляется строка состояния HTTP, за которой следуют заголовки265266*Server*267268и269270*Date*271272. Значения для этих двух заголовков берутся из методов273274[`version_string()`](https://python-all.ru/3.0/library/http.server.html#http.server.BaseHTTPRequestHandler.version_string)275276и277278[`date_time_string()`](https://python-all.ru/3.0/library/http.server.html#http.server.BaseHTTPRequestHandler.date_time_string)279280соответственно.281282#### `[http.server.BaseHTTPRequestHandler.send_header]send_header(keyword, value)`283284Записывает указанный HTTP-заголовок в выходной поток.285286*keyword*287288задаёт ключевое слово заголовка, а289290*value*291292– его значение.293294#### `[http.server.BaseHTTPRequestHandler.end_headers]end_headers()`295296Отправляет пустую строку, сигнализирующую об окончании HTTP-заголовков в ответе.297298#### `[http.server.BaseHTTPRequestHandler.log_request]log_request([code[, size]])`299300Записывает в журнал принятый (успешный) запрос. Параметр301302*code*303304должен задавать числовой код HTTP, связанный с ответом. Если размер ответа доступен, его следует передать как параметр305306*size*307308.309310#### `[http.server.BaseHTTPRequestHandler.log_error]log_error(...)`311312Журналирует ошибку, если запрос не может быть выполнен. По умолчанию передаёт сообщение в313314[`log_message()`](https://python-all.ru/3.0/library/http.server.html#http.server.BaseHTTPRequestHandler.log_message)315316, поэтому принимает те же аргументы (317318*format*319320и дополнительные значения).321322#### `[http.server.BaseHTTPRequestHandler.log_message]log_message(format, ...)`323324Записывает произвольное сообщение в325326`sys.stderr`327328. Обычно этот метод переопределяют для создания собственных механизмов журналирования ошибок. Аргумент329330*format*331332– это строка форматирования в стиле printf, в которую подставляются дополнительные аргументы333334[`log_message()`](https://python-all.ru/3.0/library/http.server.html#http.server.BaseHTTPRequestHandler.log_message)335336. К каждому сообщению добавляются адрес клиента и текущие дата и время.337338#### `[http.server.BaseHTTPRequestHandler.version_string]version_string()`339340Возвращает строку версии серверного ПО. Она представляет собой комбинацию классовых переменных341342[`server_version`](https://python-all.ru/3.0/library/http.server.html#http.server.BaseHTTPRequestHandler.server_version)343344и345346[`sys_version`](https://python-all.ru/3.0/library/http.server.html#http.server.BaseHTTPRequestHandler.sys_version)347348.349350#### `[http.server.BaseHTTPRequestHandler.date_time_string]date_time_string([timestamp])`351352Возвращает дату и время, заданные *timestamp* (который должен быть в формате, возвращаемом [`time.time()`](https://python-all.ru/3.0/library/time.html#time.time)), отформатированные для заголовка сообщения. Если *timestamp* опущен, используются текущие дата и время.353354Результат выглядит как `'Sun, 06 Nov 1994 08:49:37 GMT'`.355356#### `[http.server.BaseHTTPRequestHandler.log_date_time_string]log_date_time_string()`357358Возвращает текущие дату и время, отформатированные для логирования.359360#### `[http.server.BaseHTTPRequestHandler.address_string]address_string()`361362Возвращает адрес клиента, отформатированный для логирования. Для IP-адреса клиента выполняется поиск имени.363364#### `[http.server.SimpleHTTPRequestHandler]class http.server.SimpleHTTPRequestHandler(request, client_address, server)`365366Этот класс обслуживает файлы из текущего каталога и подкаталогов, напрямую отображая структуру каталогов на HTTP-запросы.367368Большая часть работы, такая как разбор запроса, выполняется базовым классом [`BaseHTTPRequestHandler`](https://python-all.ru/3.0/library/http.server.html#http.server.BaseHTTPRequestHandler). Этот класс реализует функции [`do_GET()`](https://python-all.ru/3.0/library/http.server.html#http.server.SimpleHTTPRequestHandler.do_GET) и [`do_HEAD()`](https://python-all.ru/3.0/library/http.server.html#http.server.SimpleHTTPRequestHandler.do_HEAD).369370Следующие атрибуты определены как атрибуты класса [`SimpleHTTPRequestHandler`](https://python-all.ru/3.0/library/http.server.html#http.server.SimpleHTTPRequestHandler):371372#### `[http.server.SimpleHTTPRequestHandler.server_version]server_version`373374Это будет375376`"SimpleHTTP/" + __version__`377378, где379380`__version__`381382определена на уровне модуля.383384#### `[http.server.SimpleHTTPRequestHandler.extensions_map]extensions_map`385386Словарь, сопоставляющий расширения с MIME-типами. Значение по умолчанию обозначается пустой строкой и считается равным387388`application/octet-stream`389390. Сопоставление используется без учёта регистра, поэтому должно содержать только ключи в нижнем регистре.391392Класс [`SimpleHTTPRequestHandler`](https://python-all.ru/3.0/library/http.server.html#http.server.SimpleHTTPRequestHandler) определяет следующие методы:393394#### `[http.server.SimpleHTTPRequestHandler.do_HEAD]do_HEAD()`395396This method serves the397398`'HEAD'`399400request type: it sends the headers it would send for the equivalent401402`GET`403404request. See the405406[`do_GET()`](https://python-all.ru/3.0/library/http.server.html#http.server.SimpleHTTPRequestHandler.do_GET)407408method for a more complete explanation of the possible headers.409410#### `[http.server.SimpleHTTPRequestHandler.do_GET]do_GET()`411412Запрос сопоставляется с локальным файлом путём интерпретации запроса как пути относительно текущего рабочего каталога.413414Если запрос был сопоставлен с каталогом, в этом каталоге проверяется наличие файла с именем `index.html` или `index.htm` (в указанном порядке). Если файл найден, возвращается его содержимое; в противном случае генерируется содержимое каталога вызовом метода `list_directory()`. Этот метод использует [`os.listdir()`](https://python-all.ru/3.0/library/os.html#os.listdir) для сканирования каталога и возвращает ответ с ошибкой `404`, если `listdir()` завершается неудачей.415416Если запрос был сопоставлен с файлом, он открывается и возвращается его содержимое. Любое исключение [`IOError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.IOError) при открытии запрошенного файла преобразуется в ошибку `404`, `'File not found'`. В противном случае тип содержимого определяется вызовом метода `guess_type()`, который, в свою очередь, использует переменную *extensions\_map*.417418Выводится заголовок `'Content-type:'` с определённым типом содержимого, затем заголовок `'Content-Length:'` с размером файла и заголовок `'Last-Modified:'` с временем изменения файла.419420Затем идёт пустая строка, обозначающая конец заголовков, а затем выводится содержимое файла. Если MIME-тип файла начинается с `text/`, файл открывается в текстовом режиме; в противном случае используется двоичный режим.421422Пример использования см. в реализации функции `test()`.423424#### `[http.server.CGIHTTPRequestHandler]class http.server.CGIHTTPRequestHandler(request, client_address, server)`425426Этот класс используется для обслуживания файлов или вывода CGI-скриптов из текущего каталога и всех подкаталогов. Обратите внимание, что сопоставление иерархической структуры HTTP с локальной файловой структурой производится точно так же, как в [`SimpleHTTPRequestHandler`](https://python-all.ru/3.0/library/http.server.html#http.server.SimpleHTTPRequestHandler).427428> **Примечание**429>430> CGI-скрипты, запускаемые классом [`CGIHTTPRequestHandler`](https://python-all.ru/3.0/library/http.server.html#http.server.CGIHTTPRequestHandler), не могут выполнять перенаправления (HTTP-код 302), поскольку код 200 (за которым следует вывод скрипта) отправляется до выполнения CGI-скрипта. Это заменяет код состояния.431432Однако класс будет запускать CGI-скрипт вместо того, чтобы отдавать его как файл, если он определит, что это CGI-скрипт. Используются только каталогизированные CGI – другая распространённая конфигурация сервера (обработка специальных расширений как обозначающих CGI-скрипты) не применяется.433434Функции `do_GET()` и `do_HEAD()` изменены для запуска CGI-скриптов и выдачи их результатов вместо файлов, если запрос ведёт к пути, расположенному внутри `cgi_directories`.435436[`CGIHTTPRequestHandler`](https://python-all.ru/3.0/library/http.server.html#http.server.CGIHTTPRequestHandler) определяет следующий атрибут данных:437438#### `[http.server.CGIHTTPRequestHandler.cgi_directories]cgi_directories`439440По умолчанию это значение равно441442`['/cgi-bin', '/htbin']`443444и определяет каталоги, которые считаются содержащими CGI-скрипты.445446[`CGIHTTPRequestHandler`](https://python-all.ru/3.0/library/http.server.html#http.server.CGIHTTPRequestHandler) определяет следующий метод:447448#### `[http.server.CGIHTTPRequestHandler.do_POST]do_POST()`449450Этот метод обрабатывает запросы типа451452`'POST'`453454, разрешённые только для CGI скриптов. При попытке отправить POST на не-CGI URL выводится ошибка 501 «Can only POST to CGI scripts».455456Обратите внимание: из соображений безопасности CGI-скрипты будут запускаться с UID пользователя nobody. Проблемы с CGI-скриптом приведут к ошибке 403.457