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

http.server.md

255 строк · 24.8 КБ · обычная страница · сырой текст · скачать

1> **Источник:** https://python-all.ru/3.2/library/http.server.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 20.20. [`http.server`](https://python-all.ru/3.2/library/http.server.html#module-http.server) – HTTP-серверы89**Исходный код:** [Lib/http/server.py](https://python-all.ru/src/3.2/Lib/http/server.py)1011---1213Этот модуль определяет классы для реализации HTTP-серверов (веб-серверов).1415Один класс, [`HTTPServer`](https://python-all.ru/3.2/library/http.server.html#http.server.HTTPServer), является подклассом `socketserver.TCPServer`. Он создаёт HTTP-сокет и прослушивает его, направляя запросы обработчику. Код для создания и запуска сервера выглядит так:1617```python18def run(server_class=HTTPServer, handler_class=BaseHTTPRequestHandler):19    server_address = ('', 8000)20    httpd = server_class(server_address, handler_class)21    httpd.serve_forever()22```2324#### `class http.server.HTTPServer(server_address, RequestHandlerClass)`2526Этот класс расширяет класс `TCPServer`, сохраняя адрес сервера в переменных экземпляра с именами `server_name` и `server_port`. Сервер доступен обработчику, обычно через переменную экземпляра `server` обработчика.2728При создании экземпляра [`HTTPServer`](https://python-all.ru/3.2/library/http.server.html#http.server.HTTPServer) необходимо передать *RequestHandlerClass*, для которого этот модуль предоставляет три различных варианта:2930#### `class http.server.BaseHTTPRequestHandler(request, client_address, server)`3132Этот класс используется для обработки HTTP-запросов, поступающих на сервер. Сам по себе он не может отвечать на реальные HTTP-запросы; его нужно наследовать, чтобы обрабатывать каждый метод запроса (например, GET или POST). [`BaseHTTPRequestHandler`](https://python-all.ru/3.2/library/http.server.html#http.server.BaseHTTPRequestHandler) предоставляет ряд переменных класса и экземпляра, а также методы для использования подклассами.3334Обработчик разбирает запрос и заголовки, затем вызывает метод, соответствующий типу запроса. Имя метода формируется из запроса. Например, для метода запроса `SPAM` будет вызван метод `do_SPAM()` без аргументов. Вся соответствующая информация хранится в переменных экземпляра обработчика. Подклассы не должны переопределять или расширять метод [`__init__()`](https://python-all.ru/3.2/reference/datamodel.html#object.__init__).3536[`BaseHTTPRequestHandler`](https://python-all.ru/3.2/library/http.server.html#http.server.BaseHTTPRequestHandler) имеет следующие переменные экземпляра:3738#### `client_address`3940Содержит кортеж вида `(host, port)`, относящийся к адресу клиента.4142#### `server`4344Содержит экземпляр сервера.4546#### `command`4748Содержит команду (тип запроса). Например, `'GET'`.4950#### `path`5152Содержит путь запроса.5354#### `request_version`5556Содержит строку версии из запроса. Например, `'HTTP/1.0'`.5758#### `headers`5960Содержит экземпляр класса, указанного [`MessageClass`](https://python-all.ru/3.2/library/http.server.html#http.server.BaseHTTPRequestHandler.MessageClass) переменной класса. Этот экземпляр разбирает и управляет заголовками в HTTP- запросе.6162#### `rfile`6364Содержит входной поток, находящийся в начале необязательных входных данных.6566#### `wfile`6768Содержит выходной поток для записи ответа обратно клиенту. При записи в этот поток необходимо строго соблюдать протокол HTTP.6970[`BaseHTTPRequestHandler`](https://python-all.ru/3.2/library/http.server.html#http.server.BaseHTTPRequestHandler) имеет следующие переменные класса:7172#### `server_version`7374Указывает версию серверного программного обеспечения. Возможно, потребуется переопределить это значение. Формат – несколько строк, разделённых пробелами, где каждая строка имеет вид имя\[/версия\]. Например, `'BaseHTTP/0.2'`.7576#### `sys_version`7778Содержит версию системы Python в форме, пригодной для использования методом [`version_string`](https://python-all.ru/3.2/library/http.server.html#http.server.BaseHTTPRequestHandler.version_string) и переменной класса [`server_version`](https://python-all.ru/3.2/library/http.server.html#http.server.BaseHTTPRequestHandler.server_version). Например, `'Python/1.4'`.7980#### `error_message_format`8182Задает строку формата для построения ответа об ошибке клиенту. Она использует спецификаторы формата в круглых скобках с ключами, поэтому операнд формата должен быть словарем. Ключ *code* должен быть целым числом, указывающим числовое значение HTTP-кода ошибки. *message* должен быть строкой, содержащей (подробное) сообщение об ошибке о том, что произошло, а *explain* должен быть объяснением номера кода ошибки. Значения по умолчанию для *message* и *explain* можно найти в переменной класса *responses*.8384#### `error_content_type`8586Задаёт HTTP-заголовок Content-Type для ответов об ошибках, отправляемых клиенту. Значение по умолчанию: `'text/html'`.8788#### `protocol_version`8990Задаёт версию протокола HTTP, используемую в ответах. Если установлено `'HTTP/1.1'`, сервер будет разрешать постоянные соединения; однако в этом случае сервер *должен* включать точный заголовок `Content-Length` (с помощью [`send_header()`](https://python-all.ru/3.2/library/http.server.html#http.server.BaseHTTPRequestHandler.send_header)) во все свои ответы клиентам. Для обратной совместимости по умолчанию используется `'HTTP/1.0'`.9192#### `MessageClass`9394Задаёт класс, похожий на [`email.message.Message`](https://python-all.ru/3.2/library/email.message.html#email.message.Message), для разбора HTTP-заголовков. Обычно его не переопределяют, и по умолчанию используется `http.client.HTTPMessage`.9596#### `responses`9798Эта переменная содержит отображение целочисленных кодов ошибок в кортежи из двух элементов, содержащие краткое и полное сообщения. Например, `{code: (shortmessage, longmessage)}`. *shortmessage* обычно используется как ключ *message* в ответе об ошибке, а *longmessage* – как ключ *explain* (см. переменную класса [`error_message_format`](https://python-all.ru/3.2/library/http.server.html#http.server.BaseHTTPRequestHandler.error_message_format)).99100Экземпляр [`BaseHTTPRequestHandler`](https://python-all.ru/3.2/library/http.server.html#http.server.BaseHTTPRequestHandler) имеет следующие методы:101102#### `handle()`103104Вызывает [`handle_one_request()`](https://python-all.ru/3.2/library/http.server.html#http.server.BaseHTTPRequestHandler.handle_one_request) один раз (или несколько, если включены постоянные соединения) для обработки входящих HTTP-запросов. Этот метод не нужно переопределять; вместо этого следует реализовать соответствующие методы `do_*()`.105106#### `handle_one_request()`107108Этот метод разбирает запрос и направляет его в соответствующий метод `do_*()`. Его не нужно переопределять.109110#### `handle_expect_100()`111112Когда HTTP/1.1-совместимый сервер получает заголовок запроса `Expect: 100-continue`, он отвечает заголовками `100 Continue`, за которыми следуют `200 OK`. Этот метод можно переопределить, чтобы вызвать ошибку, если сервер не хочет, чтобы клиент продолжал. Например, сервер может решить отправить `417 Expectation Failed` в качестве заголовка ответа и `return False`.113114Новое в версии 3.2.115116#### `send_error(code, message=None)`117118Отправляет и регистрирует полный ответ об ошибке клиенту. Числовой *code* задает HTTP-код ошибки, а *message* – необязательный, более конкретный текст. Отправляется полный набор заголовков, за которым следует текст, составленный с использованием переменной класса [`error_message_format`](https://python-all.ru/3.2/library/http.server.html#http.server.BaseHTTPRequestHandler.error_message_format).119120#### `send_response(code, message=None)`121122Отправляет заголовок ответа и регистрирует принятый запрос. Отправляется строка состояния HTTP, за которой следуют заголовки *Server* и *Date*. Значения для этих двух заголовков берутся из методов [`version_string()`](https://python-all.ru/3.2/library/http.server.html#http.server.BaseHTTPRequestHandler.version_string) и [`date_time_string()`](https://python-all.ru/3.2/library/http.server.html#http.server.BaseHTTPRequestHandler.date_time_string) соответственно.123124#### `send_header(keyword, value)`125126Сохраняет HTTP-заголовок во внутренний буфер, который будет записан в выходной поток при вызове метода [`end_headers()`](https://python-all.ru/3.2/library/http.server.html#http.server.BaseHTTPRequestHandler.end_headers). *keyword* должен задавать ключевое слово заголовка, а *value* – его значение.127128Изменено в версии 3.2: Заголовки сохраняются во внутреннем буфере.129130#### `send_response_only(code, message=None)`131132Отправляет только заголовок ответа, используется для случаев, когда сервер отправляет клиенту ответ `100 Continue`. Заголовки не буферизуются и отправляются непосредственно в выходной поток. Если *message* не указан, отправляется HTTP-сообщение, соответствующее коду ответа *code*.133134Новое в версии 3.2.135136#### `end_headers()`137138Записывает буферизированные HTTP-заголовки в выходной поток и отправляет пустую строку, указывающую на конец HTTP-заголовков в ответе.139140Изменено в версии 3.2: Буферизированные заголовки записываются в выходной поток.141142#### `log_request(code='-', size='-')`143144Записывает в журнал принятый (успешный) запрос. Параметр *code* должен задавать числовой код HTTP, связанный с ответом. Если размер ответа доступен, его следует передать как параметр *size*.145146#### `log_error(...)`147148Журналирует ошибку, если запрос не может быть выполнен. По умолчанию передаёт сообщение в [`log_message()`](https://python-all.ru/3.2/library/http.server.html#http.server.BaseHTTPRequestHandler.log_message), поэтому принимает те же аргументы (*format* и дополнительные значения).149150#### `log_message(format, ...)`151152Записывает произвольное сообщение в `sys.stderr`. Обычно этот метод переопределяют для создания собственных механизмов регистрации ошибок. Аргумент *format* – это стандартная printf-строка форматирования, к которой дополнительные аргументы [`log_message()`](https://python-all.ru/3.2/library/http.server.html#http.server.BaseHTTPRequestHandler.log_message) применяются как входные данные для форматирования. IP-адрес клиента и текущие дата и время добавляются в начало каждого сообщения.153154#### `version_string()`155156Возвращает строку версии серверного ПО. Она представляет собой комбинацию классовых переменных [`server_version`](https://python-all.ru/3.2/library/http.server.html#http.server.BaseHTTPRequestHandler.server_version) и [`sys_version`](https://python-all.ru/3.2/library/http.server.html#http.server.BaseHTTPRequestHandler.sys_version).157158#### `date_time_string(timestamp=None)`159160Возвращает дату и время, заданные *timestamp* (который должен быть None или в формате, возвращаемом [`time.time()`](https://python-all.ru/3.2/library/time.html#time.time)), отформатированные для заголовка сообщения. Если *timestamp* опущен, используются текущие дата и время.161162Результат выглядит как `'Sun, 06 Nov 1994 08:49:37 GMT'`.163164#### `log_date_time_string()`165166Возвращает текущие дату и время, отформатированные для логирования.167168#### `address_string()`169170Возвращает адрес клиента, отформатированный для логирования. Для IP-адреса клиента выполняется поиск имени.171172#### `class http.server.SimpleHTTPRequestHandler(request, client_address, server)`173174Этот класс обслуживает файлы из текущего каталога и подкаталогов, напрямую отображая структуру каталогов на HTTP-запросы.175176Большая часть работы, такая как разбор запроса, выполняется базовым классом [`BaseHTTPRequestHandler`](https://python-all.ru/3.2/library/http.server.html#http.server.BaseHTTPRequestHandler). Этот класс реализует функции [`do_GET()`](https://python-all.ru/3.2/library/http.server.html#http.server.SimpleHTTPRequestHandler.do_GET) и [`do_HEAD()`](https://python-all.ru/3.2/library/http.server.html#http.server.SimpleHTTPRequestHandler.do_HEAD).177178Следующие атрибуты определены как атрибуты класса [`SimpleHTTPRequestHandler`](https://python-all.ru/3.2/library/http.server.html#http.server.SimpleHTTPRequestHandler):179180#### `server_version`181182Это будет `"SimpleHTTP/" + __version__`, где `__version__` определена на уровне модуля.183184#### `extensions_map`185186Словарь, сопоставляющий расширения с MIME-типами. Значение по умолчанию обозначается пустой строкой и считается равным `application/octet-stream`. Сопоставление используется без учёта регистра, поэтому должно содержать только ключи в нижнем регистре.187188Класс [`SimpleHTTPRequestHandler`](https://python-all.ru/3.2/library/http.server.html#http.server.SimpleHTTPRequestHandler) определяет следующие методы:189190#### `do_HEAD()`191192This method serves the `'HEAD'` request type: it sends the headers it would send for the equivalent `GET` request. See the [`do_GET()`](https://python-all.ru/3.2/library/http.server.html#http.server.SimpleHTTPRequestHandler.do_GET) method for a more complete explanation of the possible headers.193194#### `do_GET()`195196Запрос сопоставляется с локальным файлом путём интерпретации запроса как пути относительно текущего рабочего каталога.197198Если запрос был сопоставлен с каталогом, в этом каталоге проверяется наличие файла с именем `index.html` или `index.htm` (в указанном порядке). Если файл найден, возвращается его содержимое; в противном случае генерируется содержимое каталога вызовом метода `list_directory()`. Этот метод использует [`os.listdir()`](https://python-all.ru/3.2/library/os.html#os.listdir) для сканирования каталога и возвращает ответ с ошибкой `404`, если `listdir()` завершается неудачей.199200Если запрос был сопоставлен с файлом, он открывается и возвращается его содержимое. Любое исключение [`IOError`](https://python-all.ru/3.2/library/exceptions.html#IOError) при открытии запрошенного файла преобразуется в ошибку `404`, `'File not found'`. В противном случае тип содержимого определяется вызовом метода `guess_type()`, который, в свою очередь, использует переменную *extensions\_map*.201202Выводится заголовок `'Content-type:'` с определённым типом содержимого, затем заголовок `'Content-Length:'` с размером файла и заголовок `'Last-Modified:'` с временем изменения файла.203204Затем идёт пустая строка, обозначающая конец заголовков, а затем выводится содержимое файла. Если MIME-тип файла начинается с `text/`, файл открывается в текстовом режиме; в противном случае используется двоичный режим.205206Пример использования см. в реализации вызова функции [`test()`](https://python-all.ru/3.2/library/test.html#module-test) в модуле [`http.server`](https://python-all.ru/3.2/library/http.server.html#module-http.server).207208Класс [`SimpleHTTPRequestHandler`](https://python-all.ru/3.2/library/http.server.html#http.server.SimpleHTTPRequestHandler) можно использовать следующим образом для создания очень простого веб-сервера, раздающего файлы из текущего каталога.209210```python211import http.server212import socketserver213214PORT = 8000215216Handler = http.server.SimpleHTTPRequestHandler217218httpd = socketserver.TCPServer(("", PORT), Handler)219220print("serving at port", PORT)221httpd.serve_forever()222```223224[`http.server`](https://python-all.ru/3.2/library/http.server.html#module-http.server) также можно вызвать напрямую, используя ключ [*-m*](https://python-all.ru/3.2/using/cmdline.html#cmdoption-m) интерпретатора с аргументом `port number`. Как и в предыдущем примере, он раздаёт файлы из текущего каталога.225226```python227python -m http.server 8000228```229230#### `class http.server.CGIHTTPRequestHandler(request, client_address, server)`231232Этот класс используется для обслуживания файлов или вывода CGI-скриптов из текущего каталога и всех подкаталогов. Обратите внимание, что сопоставление иерархической структуры HTTP с локальной файловой структурой производится точно так же, как в [`SimpleHTTPRequestHandler`](https://python-all.ru/3.2/library/http.server.html#http.server.SimpleHTTPRequestHandler).233234> **Примечание**235>236> CGI-скрипты, запускаемые классом [`CGIHTTPRequestHandler`](https://python-all.ru/3.2/library/http.server.html#http.server.CGIHTTPRequestHandler), не могут выполнять перенаправления (HTTP-код 302), поскольку код 200 (за которым следует вывод скрипта) отправляется до выполнения CGI-скрипта. Это заменяет код состояния.237238Однако класс будет запускать CGI-скрипт вместо того, чтобы отдавать его как файл, если он определит, что это CGI-скрипт. Используются только каталогизированные CGI – другая распространённая конфигурация сервера (обработка специальных расширений как обозначающих CGI-скрипты) не применяется.239240Функции `do_GET()` и `do_HEAD()` изменены для запуска CGI-скриптов и выдачи их результатов вместо файлов, если запрос ведёт к пути, расположенному внутри `cgi_directories`.241242[`CGIHTTPRequestHandler`](https://python-all.ru/3.2/library/http.server.html#http.server.CGIHTTPRequestHandler) определяет следующий атрибут данных:243244#### `cgi_directories`245246По умолчанию это значение равно `['/cgi-bin', '/htbin']` и определяет каталоги, которые считаются содержащими CGI-скрипты.247248[`CGIHTTPRequestHandler`](https://python-all.ru/3.2/library/http.server.html#http.server.CGIHTTPRequestHandler) определяет следующий метод:249250#### `do_POST()`251252Этот метод обрабатывает запросы типа `'POST'`, разрешённые только для CGI скриптов. При попытке отправить POST на не-CGI URL выводится ошибка 501 «Can only POST to CGI scripts».253254Обратите внимание: из соображений безопасности CGI-скрипты будут запускаться с UID пользователя nobody. Проблемы с CGI-скриптом приведут к ошибке 403.255