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

http.server.md

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

1> **Источник:** https://python-all.ru/3.16/library/http.server.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# `http.server` – HTTP-серверы89**Исходный код:** [Lib/http/server.py](https://python-all.ru/src/main/Lib/http/server.py)1011---1213Этот модуль определяет классы для реализации HTTP-серверов.1415> **Предупреждение**16>17> `http.server` не рекомендуется для использования в продакшене. Он реализует только [базовые проверки безопасности](https://python-all.ru/3.16/library/http.server.html#http-server-security).1819[Доступность](https://python-all.ru/3.16/library/intro.html#availability): не WASI.2021Этот модуль не работает или недоступен на WebAssembly. Подробнее см. [платформы WebAssembly](https://python-all.ru/3.16/library/intro.html#wasm-availability).2223Один класс, [`HTTPServer`](https://python-all.ru/3.16/library/http.server.html#http.server.HTTPServer), является подклассом [`socketserver.TCPServer`](https://python-all.ru/3.16/library/socketserver.html#socketserver.TCPServer). Он создает HTTP-сокет, прослушивает его и передает запросы обработчику. Код для создания и запуска сервера выглядит так:2425```python26def run(server_class=HTTPServer, handler_class=BaseHTTPRequestHandler):27    server_address = ('', 8000)28    httpd = server_class(server_address, handler_class)29    httpd.serve_forever()30```3132#### `class http.server.HTTPServer(server_address, RequestHandlerClass)`3334Этот класс строится на основе класса [`TCPServer`](https://python-all.ru/3.16/library/socketserver.html#socketserver.TCPServer), сохраняя адрес сервера в переменных экземпляра [`server_name`](https://python-all.ru/3.16/library/http.server.html#http.server.HTTPServer.server_name) и [`server_port`](https://python-all.ru/3.16/library/http.server.html#http.server.HTTPServer.server_port). Сервер доступен обработчику, обычно через [`server`](https://python-all.ru/3.16/library/socketserver.html#socketserver.BaseRequestHandler.server) переменную экземпляра обработчика.3536#### `server_name`3738Полное доменное имя HTTP-сервера.3940#### `server_port`4142Номер порта HTTP-сервера, полученный из *server\_address*.4344#### `class http.server.ThreadingHTTPServer(server_address, RequestHandlerClass)`4546Этот класс идентичен HTTPServer, но использует потоки для обработки запросов с помощью [`ThreadingMixIn`](https://python-all.ru/3.16/library/socketserver.html#socketserver.ThreadingMixIn). Это полезно для обработки ситуаций, когда веб-браузеры предварительно открывают сокеты, на которых [`HTTPServer`](https://python-all.ru/3.16/library/http.server.html#http.server.HTTPServer) будет ожидать бесконечно.4748Добавлено в версии 3.7.4950#### `class http.server.HTTPSServer(server_address, RequestHandlerClass, bind_and_activate=True, *, certfile, keyfile=None, password=None, alpn_protocols=None)`5152Подкласс [`HTTPServer`](https://python-all.ru/3.16/library/http.server.html#http.server.HTTPServer) с обёрнутым сокетом, использующим модуль [`ssl`](https://python-all.ru/3.16/library/ssl.html#module-ssl). Если модуль `ssl` недоступен, создание экземпляра `HTTPSServer` завершается ошибкой [`RuntimeError`](https://python-all.ru/3.16/library/exceptions.html#RuntimeError).5354Аргумент *certfile* – это путь к файлу цепочки SSL-сертификатов, а *keyfile* – путь к файлу, содержащему закрытый ключ.5556Для файлов, защищённых и зашифрованных с помощью PKCS#8, можно указать *password*, но стоит учитывать, что это может привести к раскрытию жёстко заданных паролей в открытом виде.5758> **См. также**59>60> См. [`ssl.SSLContext.load_cert_chain()`](https://python-all.ru/3.16/library/ssl.html#ssl.SSLContext.load_cert_chain) для получения дополнительной информации о допустимых значениях *certfile*, *keyfile* и *password*.6162Если указан, аргумент *alpn\_protocols* должен быть последовательностью строк, определяющих протоколы «Согласования протокола прикладного уровня» (ALPN), поддерживаемые сервером. ALPN позволяет серверу и клиенту согласовывать протокол прикладного уровня во время рукопожатия TLS.6364По умолчанию он установлен в `["http/1.1"]`, что означает, что сервер поддерживает HTTP/1.1.6566Добавлено в версии 3.14.6768#### `class http.server.ThreadingHTTPSServer(server_address, RequestHandlerClass, bind_and_activate=True, *, certfile, keyfile=None, password=None, alpn_protocols=None)`6970Этот класс идентичен [`HTTPSServer`](https://python-all.ru/3.16/library/http.server.html#http.server.HTTPSServer), но использует потоки для обработки запросов, наследуя от [`ThreadingMixIn`](https://python-all.ru/3.16/library/socketserver.html#socketserver.ThreadingMixIn). Это аналогично [`ThreadingHTTPServer`](https://python-all.ru/3.16/library/http.server.html#http.server.ThreadingHTTPServer), только с использованием `HTTPSServer`.7172Добавлено в версии 3.14.7374Классам [`HTTPServer`](https://python-all.ru/3.16/library/http.server.html#http.server.HTTPServer), [`ThreadingHTTPServer`](https://python-all.ru/3.16/library/http.server.html#http.server.ThreadingHTTPServer), [`HTTPSServer`](https://python-all.ru/3.16/library/http.server.html#http.server.HTTPSServer) и [`ThreadingHTTPSServer`](https://python-all.ru/3.16/library/http.server.html#http.server.ThreadingHTTPSServer) при создании экземпляра необходимо передать *RequestHandlerClass*, для которых этот модуль предоставляет три различных варианта:7576#### `class http.server.BaseHTTPRequestHandler(request, client_address, server)`7778Этот класс используется для обработки HTTP-запросов, поступающих на сервер. Сам по себе он не может отвечать на реальные HTTP-запросы; он должен быть унаследован для обработки каждого метода запроса (например, `'GET'` или `'POST'`). `BaseHTTPRequestHandler` предоставляет ряд переменных класса и экземпляра, а также методы для использования подклассами.7980Обработчик разбирает запрос и заголовки, затем вызывает метод, соответствующий типу запроса. Имя метода формируется из запроса. Например, для метода запроса `SPAM` будет вызван метод `do_SPAM()` без аргументов. Вся соответствующая информация хранится в переменных экземпляра обработчика. Подклассам не нужно переопределять или расширять метод `__init__()`.8182`BaseHTTPRequestHandler` имеет следующие переменные экземпляра:8384#### `client_address`8586Содержит кортеж вида `(host, port)`, относящийся к адресу клиента.8788#### `server`8990Содержит экземпляр сервера.9192#### `close_connection`9394Логическое значение, которое следует установить до того, как [`handle_one_request()`](https://python-all.ru/3.16/library/http.server.html#http.server.BaseHTTPRequestHandler.handle_one_request) вернёт результат. Оно указывает, ожидается ли ещё один запрос или соединение следует закрыть.9596#### `requestline`9798Содержит строковое представление HTTP-строки запроса. Завершающий CRLF удаляется. Этот атрибут должен быть установлен [`handle_one_request()`](https://python-all.ru/3.16/library/http.server.html#http.server.BaseHTTPRequestHandler.handle_one_request). Если ни одна допустимая строка запроса не была обработана, его следует установить в пустую строку.99100#### `command`101102Содержит команду (тип запроса). Например, `'GET'`.103104#### `path`105106Содержит путь запроса. Если присутствует компонент запроса (query) URL, то `path` включает его. Используя терминологию [**RFC 3986**](https://python-all.ru/3.16/library/http.server.html), `path` здесь включает `hier-part` и `query`.107108#### `request_version`109110Содержит строку версии из запроса. Например, `'HTTP/1.0'`.111112#### `headers`113114Holds an instance of the class specified by the [`MessageClass`](https://python-all.ru/3.16/library/http.server.html#http.server.BaseHTTPRequestHandler.MessageClass) class variable. This instance parses and manages the headers in the HTTP request. The [`parse_headers()`](https://python-all.ru/3.16/library/http.client.html#http.client.parse_headers) function from [`http.client`](https://python-all.ru/3.16/library/http.client.html#module-http.client) is used to parse the headers and it requires that the HTTP request provide a valid [**RFC 5322**](https://python-all.ru/3.16/library/http.server.html) style header.115116#### `rfile`117118Входной поток [`io.BufferedIOBase`](https://python-all.ru/3.16/library/io.html#io.BufferedIOBase), готовый к чтению с начала необязательных входных данных.119120#### `wfile`121122Содержит выходной поток для записи ответа обратно клиенту. При записи в этот поток необходимо правильно соблюдать протокол HTTP для обеспечения успешного взаимодействия с HTTP-клиентами.123124Изменено в версии 3.6: Это поток [`io.BufferedIOBase`](https://python-all.ru/3.16/library/io.html#io.BufferedIOBase).125126`BaseHTTPRequestHandler` имеет следующие атрибуты:127128#### `server_version`129130Задаёт версию серверного программного обеспечения. Возможно, вы захотите переопределить это. Формат – несколько строк, разделённых пробелами, где каждая строка имеет вид имя\[/версия\]. Например, `'BaseHTTP/0.2'`.131132#### `sys_version`133134Содержит версию системы Python в форме, пригодной для использования методом [`version_string`](https://python-all.ru/3.16/library/http.server.html#http.server.BaseHTTPRequestHandler.version_string) и классовой переменной [`server_version`](https://python-all.ru/3.16/library/http.server.html#http.server.BaseHTTPRequestHandler.server_version). Например, `'Python/1.4'`.135136#### `error_message_format`137138Задаёт строку формата, которая должна использоваться методом [`send_error()`](https://python-all.ru/3.16/library/http.server.html#http.server.BaseHTTPRequestHandler.send_error) для построения ответа об ошибке клиенту. По умолчанию строка заполняется переменными из [`responses`](https://python-all.ru/3.16/library/http.server.html#http.server.BaseHTTPRequestHandler.responses) на основе кода состояния, переданного в `send_error()`.139140#### `error_content_type`141142Задаёт HTTP-заголовок Content-Type ответов об ошибках, отправляемых клиенту. Значение по умолчанию – `'text/html'`.143144#### `protocol_version`145146Задаёт версию HTTP, которой соответствует сервер. Она отправляется в ответах, чтобы сообщить клиенту о коммуникационных возможностях сервера для будущих запросов. Если установлено в `'HTTP/1.1'`, сервер будет разрешать постоянные HTTP-соединения; однако ваш сервер *обязан* тогда включать точный заголовок `Content-Length` (используя [`send_header()`](https://python-all.ru/3.16/library/http.server.html#http.server.BaseHTTPRequestHandler.send_header)) во все свои ответы клиентам. Для обратной совместимости по умолчанию установлено значение `'HTTP/1.0'`.147148#### `MessageClass`149150Задаёт класс, подобный [`email.message.Message`](https://python-all.ru/3.16/library/email.compat32-message.html#email.message.Message), для разбора HTTP-заголовков. Обычно он не переопределяется и по умолчанию равен [`http.client.HTTPMessage`](https://python-all.ru/3.16/library/http.client.html#http.client.HTTPMessage).151152#### `responses`153154Этот атрибут содержит соответствие целочисленных кодов ошибок кортежам из двух элементов – короткого и длинного сообщения. Например, `{code: (shortmessage, longmessage)}`. Обычно *shortmessage* используется как ключ *message* в ответе об ошибке, а *longmessage* – как ключ *explain*. Он используется методами [`send_response_only()`](https://python-all.ru/3.16/library/http.server.html#http.server.BaseHTTPRequestHandler.send_response_only) и [`send_error()`](https://python-all.ru/3.16/library/http.server.html#http.server.BaseHTTPRequestHandler.send_error).155156Экземпляр `BaseHTTPRequestHandler` имеет следующие методы:157158#### `handle()`159160Вызывает [`handle_one_request()`](https://python-all.ru/3.16/library/http.server.html#http.server.BaseHTTPRequestHandler.handle_one_request) один раз (или, если включены постоянные соединения, несколько раз) для обработки входящих HTTP-запросов. Этот метод не требуется переопределять; вместо этого следует реализовать соответствующие методы `do_*()` .161162#### `handle_one_request()`163164Этот метод разбирает и направляет запрос соответствующему методу `do_*()`. Его не требуется переопределять.165166#### `handle_expect_100()`167168Когда сервер, соответствующий HTTP/1.1, получает заголовок запроса `Expect: 100-continue`, он отвечает кодом `100 Continue`, за которым следуют заголовки `200 OK`. Этот метод можно переопределить, чтобы вызвать ошибку, если сервер не хочет, чтобы клиент продолжал. Например, сервер может решить отправить `417 Expectation Failed` в качестве заголовка ответа и `return False`.169170Добавлено в версии 3.2.171172#### `send_error(code, message=None, explain=None)`173174Отправляет и записывает в журнал полный ответ об ошибке клиенту. Числовой код *code* задаёт код HTTP-ошибки, а *message* – необязательное короткое, понятное человеку описание ошибки. Аргумент *explain* можно использовать для предоставления более подробной информации об ошибке; он будет отформатирован с использованием атрибута [`error_message_format`](https://python-all.ru/3.16/library/http.server.html#http.server.BaseHTTPRequestHandler.error_message_format) и отправлен после полного набора заголовков в качестве тела ответа. Атрибут [`responses`](https://python-all.ru/3.16/library/http.server.html#http.server.BaseHTTPRequestHandler.responses) содержит значения по умолчанию для *message* и *explain*, которые будут использованы, если значение не указано; для неизвестных кодов значением по умолчанию для обоих является строка `???`. Тело будет пустым, если метод HEAD или код ответа является одним из следующих: `1xx`, `204 No Content`, `205 Reset Content`, `304 Not Modified`.175176Изменено в версии 3.4: Ответ об ошибке включает заголовок Content-Length. Добавлен аргумент *explain*.177178#### `send_response(code, message=None)`179180Добавляет заголовок ответа в буфер заголовков и записывает в журнал принятый запрос. Строка состояния HTTP записывается во внутренний буфер, за которым следуют заголовки *Server* и *Date*. Значения этих двух заголовков берутся из методов [`version_string()`](https://python-all.ru/3.16/library/http.server.html#http.server.BaseHTTPRequestHandler.version_string) и [`date_time_string()`](https://python-all.ru/3.16/library/http.server.html#http.server.BaseHTTPRequestHandler.date_time_string) соответственно. Если сервер не собирается отправлять другие заголовки с помощью метода [`send_header()`](https://python-all.ru/3.16/library/http.server.html#http.server.BaseHTTPRequestHandler.send_header), то после `send_response()` следует вызов [`end_headers()`](https://python-all.ru/3.16/library/http.server.html#http.server.BaseHTTPRequestHandler.end_headers) .181182Изменено в версии 3.3: Заголовки сохраняются во внутреннем буфере, и [`end_headers()`](https://python-all.ru/3.16/library/http.server.html#http.server.BaseHTTPRequestHandler.end_headers) должен вызываться явно.183184#### `send_header(keyword, value)`185186Добавляет HTTP-заголовок во внутренний буфер, который будет записан в выходной поток при вызове [`end_headers()`](https://python-all.ru/3.16/library/http.server.html#http.server.BaseHTTPRequestHandler.end_headers) или [`flush_headers()`](https://python-all.ru/3.16/library/http.server.html#http.server.BaseHTTPRequestHandler.flush_headers). Параметр *keyword* должен задавать ключевое слово заголовка, а *value* – его значение. Обратите внимание, что после завершения вызовов send\_header `end_headers()` ДОЛЖЕН БЫТЬ ВЫЗВАН для завершения операции.187188Этот метод не отклоняет ввод, содержащий последовательности CRLF.189190Изменено в версии 3.2: Заголовки сохраняются во внутреннем буфере.191192#### `send_response_only(code, message=None)`193194Отправляет только заголовок ответа, используется в случаях, когда сервер отправляет клиенту ответ `100 Continue`. Заголовки не буферизируются и отправляются непосредственно в выходной поток. Если *message* не указан, отправляется HTTP-сообщение, соответствующее коду ответа *code*.195196Этот метод не отклоняет *message*, содержащий последовательности CRLF.197198Добавлено в версии 3.2.199200#### `end_headers()`201202Добавляет пустую строку (обозначающую конец HTTP-заголовков в ответе) в буфер заголовков и вызывает [`flush_headers()`](https://python-all.ru/3.16/library/http.server.html#http.server.BaseHTTPRequestHandler.flush_headers).203204Изменено в версии 3.2: Буферизированные заголовки записываются в выходной поток.205206#### `flush_headers()`207208Наконец отправляет заголовки в выходной поток и очищает внутренний буфер заголовков.209210Добавлено в версии 3.3.211212#### `log_request(code='-', size='-')`213214Записывает в журнал принятый (успешный) запрос. Параметр *code* должен задавать числовой код HTTP, связанный с ответом. Если размер ответа доступен, его следует передать как параметр *size*.215216#### `log_error(...)`217218Записывает в журнал ошибку, когда запрос не может быть выполнен. По умолчанию передаёт сообщение в [`log_message()`](https://python-all.ru/3.16/library/http.server.html#http.server.BaseHTTPRequestHandler.log_message), поэтому принимает те же аргументы (*format* и дополнительные значения).219220#### `log_message(format, ...)`221222Записывает произвольное сообщение в `sys.stderr`. Обычно этот метод переопределяют для создания собственных механизмов регистрации ошибок. Аргумент *format* – это стандартная форматная строка в стиле printf, в которой дополнительные аргументы `log_message()` используются при форматировании. IP-адрес клиента и текущие дата и время добавляются в начало каждого записываемого сообщения.223224#### `version_string()`225226Возвращает строку версии серверного программного обеспечения. Это комбинация атрибутов [`server_version`](https://python-all.ru/3.16/library/http.server.html#http.server.BaseHTTPRequestHandler.server_version) и [`sys_version`](https://python-all.ru/3.16/library/http.server.html#http.server.BaseHTTPRequestHandler.sys_version).227228#### `date_time_string(timestamp=None)`229230Возвращает дату и время, заданные *timestamp* (который должен быть `None` или в формате, возвращаемом [`time.time()`](https://python-all.ru/3.16/library/time.html#time.time)), отформатированные для заголовка сообщения. Если *timestamp* опущен, используются текущие дата и время.231232Результат выглядит как `'Sun, 06 Nov 1994 08:49:37 GMT'`.233234#### `log_date_time_string()`235236Возвращает текущие дату и время, отформатированные для логирования.237238#### `address_string()`239240Возвращает адрес клиента.241242Изменено в версии 3.3: Ранее выполнялся поиск по имени. Чтобы избежать задержек разрешения имён, теперь всегда возвращается IP-адрес.243244#### `class http.server.SimpleHTTPRequestHandler(request, client_address, server, *, directory=None, extra_response_headers=None)`245246Этот класс обслуживает файлы из каталога *directory* и ниже или из текущего каталога, если *directory* не указан, напрямую отображая структуру каталогов в HTTP-запросы.247248Изменено в версии 3.7: Добавлен параметр *directory*.249250Изменено в версии 3.9: Параметр *directory* теперь принимает [объект, подобный пути](https://python-all.ru/3.16/glossary.html#term-path-like-object).251252Изменено в версии 3.15: Добавлен параметр *extra\_response\_headers*.253254Бо́льшая часть работы, например разбор запроса, выполняется базовым классом [`BaseHTTPRequestHandler`](https://python-all.ru/3.16/library/http.server.html#http.server.BaseHTTPRequestHandler). Этот класс реализует функции [`do_GET()`](https://python-all.ru/3.16/library/http.server.html#http.server.SimpleHTTPRequestHandler.do_GET) и [`do_HEAD()`](https://python-all.ru/3.16/library/http.server.html#http.server.SimpleHTTPRequestHandler.do_HEAD).255256Следующие атрибуты определены на уровне класса `SimpleHTTPRequestHandler`:257258#### `server_version`259260Это будет `"SimpleHTTP/" + __version__`, где `__version__` определён на уровне модуля.261262#### `default_content_type`263264Указывает значение заголовка Content-Type, отправляемое, когда MIME-тип невозможно определить по расширению файла запрашиваемого URL. По умолчанию установлено значение `'application/octet-stream'`.265266Добавлено в версии 3.15.267268#### `index_pages`269270Задаёт имена файлов, которые считаются страницами индекса каталога.271272По умолчанию `("index.html", "index.htm")`.273274Добавлено в версии 3.12.275276#### `extensions_map`277278Словарь, сопоставляющий расширения с MIME-типами, содержит пользовательские переопределения для системных сопоставлений по умолчанию. Сопоставление используется без учёта регистра, поэтому должно содержать только ключи в нижнем регистре.279280Изменено в версии 3.9: Этот словарь больше не заполняется системными сопоставлениями по умолчанию, а содержит только переопределения.281282#### `extra_response_headers`283284Последовательность пар `(name, value)`, содержащих пользовательские дополнительные HTTP-заголовки ответа, добавляемые к каждому успешному ответу с кодом 200. Эти заголовки не включаются в ответы с другими кодами состояния.285286Заголовки, которые сервер отправляет автоматически, такие как `Content-Type`, не будут перезаписаны `extra_response_headers`.287288Класс `SimpleHTTPRequestHandler` определяет следующие методы:289290#### `do_HEAD()`291292Этот метод обслуживает тип запроса `'HEAD'`: он отправляет заголовки, которые отправил бы для эквивалентного запроса `GET`. Смотрите метод [`do_GET()`](https://python-all.ru/3.16/library/http.server.html#http.server.SimpleHTTPRequestHandler.do_GET) для более полного объяснения возможных заголовков.293294#### `do_GET()`295296Запрос сопоставляется с локальным файлом путём интерпретации запроса как пути относительно текущего рабочего каталога.297298Если запрос был сопоставлен с каталогом, каталог проверяется на наличие страницы индекса, как указано в [`index_pages`](https://python-all.ru/3.16/library/http.server.html#http.server.SimpleHTTPRequestHandler.index_pages). Если найдена, возвращается содержимое файла; в противном случае формируется список каталога вызовом метода [`list_directory()`](https://python-all.ru/3.16/library/http.server.html#http.server.SimpleHTTPRequestHandler.list_directory). Этот метод использует [`os.listdir()`](https://python-all.ru/3.16/library/os.html#os.listdir) для сканирования каталога и возвращает ответ с ошибкой `404`, если `listdir()` завершается неудачей.299300Если запрос был сопоставлен с файлом, он открывается. Любое исключение [`OSError`](https://python-all.ru/3.16/library/exceptions.html#OSError) при открытии запрошенного файла сопоставляется с ошибкой `404`, `'File not found'`. Если в запросе был заголовок `'If-Modified-Since'` и файл не изменялся после этого времени, отправляется ответ `304`, `'Not Modified'`. В противном случае тип содержимого определяется вызовом метода [`guess_type()`](https://python-all.ru/3.16/library/http.server.html#http.server.SimpleHTTPRequestHandler.guess_type), который, в свою очередь, использует переменную *extensions\_map*, и возвращается содержимое файла.301302Выводится заголовок `'Content-type:'` с определённым типом содержимого, за которым следуют заголовок `'Content-Length:'` с размером файла и заголовок `'Last-Modified:'` со временем изменения файла.303304Атрибут экземпляра [`extra_response_headers`](https://python-all.ru/3.16/library/http.server.html#http.server.SimpleHTTPRequestHandler.extra_response_headers) – это последовательность пар `(name, value)`, содержащих пользовательские дополнительные заголовки ответа.305306Затем следует пустая строка, обозначающая конец заголовков, после чего выводится содержимое файла.307308Пример использования см. в реализации функции `test` в [Lib/http/server.py](https://python-all.ru/src/main/Lib/http/server.py).309310Изменено в версии 3.7: Поддержка заголовка `'If-Modified-Since'`.311312#### `list_directory(path)`313314Вспомогательная функция для отображения содержимого каталога *path* при отсутствии индексной страницы.315316Возвращает либо [файлоподобный объект](https://python-all.ru/3.16/glossary.html#term-file-like-object) (который должен быть закрыт вызывающей стороной), либо `None` для обозначения ошибки; в этом случае вызывающая сторона больше ничего не делает. В любом случае заголовки отправляются.317318#### `guess_type(path)`319320Определяет тип файла по указанному *path*.321322Возвращает строку вида `type/subtype`, которую можно использовать в заголовке MIME Content-type.323324Реализация по умолчанию ищет расширение файла в [`extensions_map`](https://python-all.ru/3.16/library/http.server.html#http.server.SimpleHTTPRequestHandler.extensions_map); если не найдено, обращается к [`mimetypes.guess_file_type()`](https://python-all.ru/3.16/library/mimetypes.html#mimetypes.guess_file_type), а затем к [`default_content_type`](https://python-all.ru/3.16/library/http.server.html#http.server.SimpleHTTPRequestHandler.default_content_type).325326Изменено в версии 3.13: Добавлен [`mimetypes.guess_file_type()`](https://python-all.ru/3.16/library/mimetypes.html#mimetypes.guess_file_type) в качестве запасного варианта.327328Класс [`SimpleHTTPRequestHandler`](https://python-all.ru/3.16/library/http.server.html#http.server.SimpleHTTPRequestHandler) можно использовать для создания простейшего веб-сервера, обслуживающего файлы из текущего каталога, следующим образом:329330```python331import http.server332import socketserver333334PORT = 8000335336Handler = http.server.SimpleHTTPRequestHandler337338with socketserver.TCPServer(("", PORT), Handler) as httpd:339    print("serving at port", PORT)340    httpd.serve_forever()341```342343[`SimpleHTTPRequestHandler`](https://python-all.ru/3.16/library/http.server.html#http.server.SimpleHTTPRequestHandler) также можно наследовать для расширения функциональности, например, для использования других имён индексных файлов путём переопределения атрибута класса [`index_pages`](https://python-all.ru/3.16/library/http.server.html#http.server.SimpleHTTPRequestHandler.index_pages).344345## Интерфейс командной строки346347`http.server` также можно вызвать напрямую, используя флаг [`-m`](https://python-all.ru/3.16/using/cmdline.html#cmdoption-m) интерпретатора. Следующий пример показывает, как обслуживать файлы из текущего каталога:348349```bash350python -m http.server [OPTIONS] [port]351```352353Принимаются следующие опции:354355#### `port`356357По умолчанию сервер прослушивает порт 8000. Значение по умолчанию можно переопределить, передав желаемый номер порта в качестве аргумента:358359```bash360python -m http.server 9000361```362363#### `-b, --bind <address>`364365Указывает конкретный адрес, к которому сервер должен привязаться. Поддерживаются адреса как IPv4, так и IPv6. По умолчанию сервер привязывается ко всем интерфейсам. Например, следующая команда заставляет сервер привязываться только к localhost:366367```bash368python -m http.server --bind 127.0.0.1369```370371Добавлено в версии 3.4.372373Изменено в версии 3.8: Добавлена поддержка IPv6 в опции `--bind`.374375#### `-d, --directory <dir>`376377Указывает каталог, из которого следует обслуживать файлы. По умолчанию сервер использует текущий каталог. Например, следующая команда использует конкретный каталог:378379```bash380python -m http.server --directory /tmp/381```382383Добавлено в версии 3.7.384385#### `-p, --protocol <version>`386387Определяет версию HTTP, которой соответствует сервер. По умолчанию сервер соответствует HTTP/1.0. Например, следующая команда запускает сервер, соответствующий HTTP/1.1:388389```bash390python -m http.server --protocol HTTP/1.1391```392393Добавлено в версии 3.12.394395#### `--content-type <content_type>`396397Указывает заголовок HTTP Content-Type по умолчанию, используемый, когда MIME-тип невозможно определить по расширению файла URL. По умолчанию сервер использует `'application/octet-stream'`:398399```bash400python -m http.server --content-type text/html401```402403Добавлено в версии 3.15.404405#### `--tls-cert`406407Задаёт цепочку TLS-сертификатов для HTTPS-соединений:408409```bash410python -m http.server --tls-cert fullchain.pem411```412413Добавлено в версии 3.14.414415#### `--tls-key`416417Задаёт файл закрытого ключа для HTTPS-соединений.418419Этот параметр требует указания `--tls-cert`.420421Добавлено в версии 3.14.422423#### `--tls-password-file`424425Задаёт файл пароля для закрытых ключей, защищённых паролем:426427```bash428python -m http.server \429       --tls-cert cert.pem \430       --tls-key key.pem \431       --tls-password-file password.txt432```433434Этот параметр требует указания `--tls-cert`.435436Добавлено в версии 3.14.437438#### `-H, --header <header> <value>`439440Указывает дополнительный заголовок HTTP-ответа, который будет отправлен при успешных ответах HTTP 200. Может использоваться несколько раз для отправки дополнительных пользовательских заголовков ответа. Заголовки, отправляемые сервером автоматически (например, Content-Type), не будут перезаписаны.441442Добавлено в версии 3.15.443444## Соображения безопасности445446[`SimpleHTTPRequestHandler`](https://python-all.ru/3.16/library/http.server.html#http.server.SimpleHTTPRequestHandler) будет переходить по символическим ссылкам при обработке запросов, что позволяет обслуживать файлы за пределами указанной директории.447448Методы [`BaseHTTPRequestHandler.send_header()`](https://python-all.ru/3.16/library/http.server.html#http.server.BaseHTTPRequestHandler.send_header) и [`BaseHTTPRequestHandler.send_response_only()`](https://python-all.ru/3.16/library/http.server.html#http.server.BaseHTTPRequestHandler.send_response_only) предполагают очищенные входные данные и не выполняют проверку входных данных, например, на наличие последовательностей CRLF. Непроверенные входные данные могут привести к атакам внедрения HTTP-заголовков.449450В более ранних версиях Python не удалялись управляющие символы из сообщений журнала, выводимых в stderr из `python -m http.server` или реализации по умолчанию [`BaseHTTPRequestHandler`](https://python-all.ru/3.16/library/http.server.html#http.server.BaseHTTPRequestHandler) `.log_message`. Это могло позволить удалённым клиентам, подключающимся к вашему серверу, отправлять вредоносные управляющие коды на ваш терминал.451452Изменено в версии 3.12: Управляющие символы удаляются из журналов stderr.453