http.server.md
1> **Источник:** https://python-all.ru/3.9/library/http.server.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# [`http.server`](https://python-all.ru/3.9/library/http.server.html#module-http.server) – HTTP-серверы89**Исходный код:** [Lib/http/server.py](https://python-all.ru/src/3.9/Lib/http/server.py)1011---1213Этот модуль определяет классы для реализации HTTP-серверов (веб-серверов).1415> **Предупреждение**16>17> [`http.server`](https://python-all.ru/3.9/library/http.server.html#module-http.server) не рекомендуется для использования в продакшене. Он реализует только [базовые проверки безопасности](https://python-all.ru/3.9/library/http.server.html#http-server-security).1819Один класс, [`HTTPServer`](https://python-all.ru/3.9/library/http.server.html#http.server.HTTPServer), является подклассом [`socketserver.TCPServer`](https://python-all.ru/3.9/library/socketserver.html#socketserver.TCPServer). Он создает HTTP-сокет, прослушивает его и передает запросы обработчику. Код для создания и запуска сервера выглядит так:2021```python22def run(server_class=HTTPServer, handler_class=BaseHTTPRequestHandler):23 server_address = ('', 8000)24 httpd = server_class(server_address, handler_class)25 httpd.serve_forever()26```2728#### `class http.server.HTTPServer(server_address, RequestHandlerClass)`2930Этот класс расширяет класс [`TCPServer`](https://python-all.ru/3.9/library/socketserver.html#socketserver.TCPServer), сохраняя адрес сервера в переменных экземпляра с именами `server_name` и `server_port`. Сервер доступен через обработчик, обычно через переменную экземпляра `server` обработчика.3132#### `class http.server.ThreadingHTTPServer(server_address, RequestHandlerClass)`3334Этот класс идентичен HTTPServer, но использует потоки для обработки запросов с помощью [`ThreadingMixIn`](https://python-all.ru/3.9/library/socketserver.html#socketserver.ThreadingMixIn). Это полезно для обработки ситуаций, когда веб-браузеры предварительно открывают сокеты, на которых [`HTTPServer`](https://python-all.ru/3.9/library/http.server.html#http.server.HTTPServer) будет ожидать бесконечно.3536Добавлено в версии 3.7.3738[`HTTPServer`](https://python-all.ru/3.9/library/http.server.html#http.server.HTTPServer) и [`ThreadingHTTPServer`](https://python-all.ru/3.9/library/http.server.html#http.server.ThreadingHTTPServer) должны быть указаны при создании *RequestHandlerClass*, для которого этот модуль предоставляет три различных варианта:3940#### `class http.server.BaseHTTPRequestHandler(request, client_address, server)`4142Этот класс используется для обработки HTTP-запросов, поступающих на сервер. Сам по себе он не может отвечать на реальные HTTP-запросы; его нужно подклассифицировать для обработки каждого метода запроса (например, GET или POST). [`BaseHTTPRequestHandler`](https://python-all.ru/3.9/library/http.server.html#http.server.BaseHTTPRequestHandler) предоставляет ряд переменных класса и экземпляра, а также методы для использования подклассами.4344Обработчик разбирает запрос и заголовки, затем вызывает метод, соответствующий типу запроса. Имя метода формируется из запроса. Например, для метода запроса `SPAM` будет вызван метод `do_SPAM()` без аргументов. Вся соответствующая информация хранится в переменных экземпляра обработчика. Подклассам не нужно переопределять или расширять метод [`__init__()`](https://python-all.ru/3.9/reference/datamodel.html#object.__init__).4546[`BaseHTTPRequestHandler`](https://python-all.ru/3.9/library/http.server.html#http.server.BaseHTTPRequestHandler) имеет следующие переменные экземпляра:4748#### `client_address`4950Содержит кортеж вида `(host, port)`, относящийся к адресу клиента.5152#### `server`5354Содержит экземпляр сервера.5556#### `close_connection`5758Логическое значение, которое следует установить до того, как [`handle_one_request()`](https://python-all.ru/3.9/library/http.server.html#http.server.BaseHTTPRequestHandler.handle_one_request) вернёт результат. Оно указывает, ожидается ли ещё один запрос или соединение следует закрыть.5960#### `requestline`6162Содержит строковое представление HTTP-строки запроса. Завершающий CRLF удаляется. Этот атрибут должен быть установлен [`handle_one_request()`](https://python-all.ru/3.9/library/http.server.html#http.server.BaseHTTPRequestHandler.handle_one_request). Если ни одна допустимая строка запроса не была обработана, его следует установить в пустую строку.6364#### `command`6566Содержит команду (тип запроса). Например, `'GET'`.6768#### `path`6970Содержит путь запроса. Если присутствует компонент запроса URL, то `path` включает запрос. Согласно терминологии [**RFC 3986**](https://python-all.ru/3.9/library/http.server.html), `path` здесь включает в себя `hier-part` и `query`.7172#### `request_version`7374Содержит строку версии из запроса. Например, `'HTTP/1.0'`.7576#### `headers`7778Содержит экземпляр класса, заданного переменной класса [`MessageClass`](https://python-all.ru/3.9/library/http.server.html#http.server.BaseHTTPRequestHandler.MessageClass). Этот экземпляр разбирает и управляет заголовками HTTP-запроса. Функция [`parse_headers()`](https://python-all.ru/3.9/library/http.client.html#http.client.parse_headers) из [`http.client`](https://python-all.ru/3.9/library/http.client.html#module-http.client) используется для разбора заголовков, и она требует, чтобы HTTP-запрос предоставлял корректный заголовок в стиле [**RFC 2822**](https://python-all.ru/3.9/library/http.server.html).7980#### `rfile`8182Входной поток [`io.BufferedIOBase`](https://python-all.ru/3.9/library/io.html#io.BufferedIOBase), готовый к чтению с начала необязательных входных данных.8384#### `wfile`8586Содержит выходной поток для записи ответа обратно клиенту. При записи в этот поток необходимо правильно соблюдать протокол HTTP для обеспечения успешного взаимодействия с HTTP-клиентами.8788Изменено в версии 3.6: Это поток [`io.BufferedIOBase`](https://python-all.ru/3.9/library/io.html#io.BufferedIOBase).8990[`BaseHTTPRequestHandler`](https://python-all.ru/3.9/library/http.server.html#http.server.BaseHTTPRequestHandler) имеет следующие атрибуты:9192#### `server_version`9394Задаёт версию серверного программного обеспечения. Возможно, вы захотите переопределить это. Формат – несколько строк, разделённых пробелами, где каждая строка имеет вид имя\[/версия\]. Например, `'BaseHTTP/0.2'`.9596#### `sys_version`9798Содержит версию системы Python в форме, пригодной для использования методом [`version_string`](https://python-all.ru/3.9/library/http.server.html#http.server.BaseHTTPRequestHandler.version_string) и классовой переменной [`server_version`](https://python-all.ru/3.9/library/http.server.html#http.server.BaseHTTPRequestHandler.server_version). Например, `'Python/1.4'`.99100#### `error_message_format`101102Задаёт строку формата, которая должна использоваться методом [`send_error()`](https://python-all.ru/3.9/library/http.server.html#http.server.BaseHTTPRequestHandler.send_error) для формирования ответа об ошибке клиенту. Строка по умолчанию заполняется переменными из [`responses`](https://python-all.ru/3.9/library/http.server.html#http.server.BaseHTTPRequestHandler.responses) на основе кода состояния, переданного в [`send_error()`](https://python-all.ru/3.9/library/http.server.html#http.server.BaseHTTPRequestHandler.send_error).103104#### `error_content_type`105106Задаёт HTTP-заголовок Content-Type ответов об ошибках, отправляемых клиенту. Значение по умолчанию – `'text/html'`.107108#### `protocol_version`109110Определяет версию HTTP-протокола, используемую в ответах. Если установлено в `'HTTP/1.1'`, сервер будет разрешать постоянные HTTP-соединения; однако сервер *должен* затем включать точный заголовок `Content-Length` (используя [`send_header()`](https://python-all.ru/3.9/library/http.server.html#http.server.BaseHTTPRequestHandler.send_header)) во все свои ответы клиентам. Для обратной совместимости по умолчанию используется `'HTTP/1.0'`.111112#### `MessageClass`113114Задаёт класс, подобный [`email.message.Message`](https://python-all.ru/3.9/library/email.compat32-message.html#email.message.Message), для разбора HTTP-заголовков. Обычно он не переопределяется и по умолчанию равен `http.client.HTTPMessage`.115116#### `responses`117118Этот атрибут содержит соответствие целочисленных кодов ошибок кортежам из двух элементов – короткого и длинного сообщения. Например, `{code: (shortmessage, longmessage)}`. Обычно *shortmessage* используется как ключ *message* в ответе об ошибке, а *longmessage* – как ключ *explain*. Он используется методами [`send_response_only()`](https://python-all.ru/3.9/library/http.server.html#http.server.BaseHTTPRequestHandler.send_response_only) и [`send_error()`](https://python-all.ru/3.9/library/http.server.html#http.server.BaseHTTPRequestHandler.send_error).119120Экземпляр [`BaseHTTPRequestHandler`](https://python-all.ru/3.9/library/http.server.html#http.server.BaseHTTPRequestHandler) имеет следующие методы:121122#### `handle()`123124Вызывает [`handle_one_request()`](https://python-all.ru/3.9/library/http.server.html#http.server.BaseHTTPRequestHandler.handle_one_request) один раз (или, если включены постоянные соединения, несколько раз) для обработки входящих HTTP-запросов. Этот метод не требуется переопределять; вместо этого следует реализовать соответствующие методы `do_*()` .125126#### `handle_one_request()`127128Этот метод разбирает и направляет запрос соответствующему методу `do_*()`. Его не требуется переопределять.129130#### `handle_expect_100()`131132Когда сервер, соответствующий HTTP/1.1, получает заголовок запроса `Expect: 100-continue`, он отвечает заголовком `100 Continue`, за которым следуют заголовки `200 OK`. Этот метод можно переопределить, чтобы вызвать ошибку, если сервер не хочет, чтобы клиент продолжал. Например, сервер может решить отправить `417 Expectation Failed` в качестве заголовка ответа и `return False`.133134Новое в версии 3.2.135136#### `send_error(code, message=None, explain=None)`137138Отправляет и записывает в журнал полный ответ об ошибке клиенту. Числовой код *code* задаёт код HTTP-ошибки, а *message* – необязательное короткое, понятное человеку описание ошибки. Аргумент *explain* можно использовать для предоставления более подробной информации об ошибке; он будет отформатирован с использованием атрибута [`error_message_format`](https://python-all.ru/3.9/library/http.server.html#http.server.BaseHTTPRequestHandler.error_message_format) и отправлен после полного набора заголовков в качестве тела ответа. Атрибут [`responses`](https://python-all.ru/3.9/library/http.server.html#http.server.BaseHTTPRequestHandler.responses) содержит значения по умолчанию для *message* и *explain*, которые будут использованы, если значение не указано; для неизвестных кодов значением по умолчанию для обоих является строка `???`. Тело будет пустым, если метод HEAD или код ответа является одним из следующих: `1xx`, `204 No Content`, `205 Reset Content`, `304 Not Modified`.139140Изменено в версии 3.4: Ответ об ошибке включает заголовок Content-Length. Добавлен аргумент *explain*.141142#### `send_response(code, message=None)`143144Добавляет заголовок ответа в буфер заголовков и записывает в журнал принятый запрос. Строка состояния HTTP записывается во внутренний буфер, за которым следуют заголовки *Server* и *Date*. Значения этих двух заголовков берутся из методов [`version_string()`](https://python-all.ru/3.9/library/http.server.html#http.server.BaseHTTPRequestHandler.version_string) и [`date_time_string()`](https://python-all.ru/3.9/library/http.server.html#http.server.BaseHTTPRequestHandler.date_time_string) соответственно. Если сервер не собирается отправлять другие заголовки с помощью метода [`send_header()`](https://python-all.ru/3.9/library/http.server.html#http.server.BaseHTTPRequestHandler.send_header), то после [`send_response()`](https://python-all.ru/3.9/library/http.server.html#http.server.BaseHTTPRequestHandler.send_response) следует вызов [`end_headers()`](https://python-all.ru/3.9/library/http.server.html#http.server.BaseHTTPRequestHandler.end_headers) .145146Изменено в версии 3.3: Заголовки сохраняются во внутреннем буфере, и [`end_headers()`](https://python-all.ru/3.9/library/http.server.html#http.server.BaseHTTPRequestHandler.end_headers) должен вызываться явно.147148#### `send_header(keyword, value)`149150Добавляет HTTP-заголовок во внутренний буфер, который будет записан в выходной поток при вызове [`end_headers()`](https://python-all.ru/3.9/library/http.server.html#http.server.BaseHTTPRequestHandler.end_headers) или [`flush_headers()`](https://python-all.ru/3.9/library/http.server.html#http.server.BaseHTTPRequestHandler.flush_headers). Параметр *keyword* должен задавать ключевое слово заголовка, а *value* – его значение. Обратите внимание, что после завершения вызовов send\_header [`end_headers()`](https://python-all.ru/3.9/library/http.server.html#http.server.BaseHTTPRequestHandler.end_headers) ДОЛЖЕН БЫТЬ ВЫЗВАН для завершения операции.151152Изменено в версии 3.2: Заголовки сохраняются во внутреннем буфере.153154#### `send_response_only(code, message=None)`155156Отправляет только заголовок ответа, используется в случаях, когда сервер отправляет клиенту ответ `100 Continue`. Заголовки не буферизуются и отправляются непосредственно в выходной поток. Если *message* не указан, отправляется HTTP-сообщение, соответствующее коду ответа *code*.157158Новое в версии 3.2.159160#### `end_headers()`161162Добавляет пустую строку (обозначающую конец HTTP-заголовков в ответе) в буфер заголовков и вызывает [`flush_headers()`](https://python-all.ru/3.9/library/http.server.html#http.server.BaseHTTPRequestHandler.flush_headers).163164Изменено в версии 3.2: Буферизированные заголовки записываются в выходной поток.165166#### `flush_headers()`167168Наконец отправляет заголовки в выходной поток и очищает внутренний буфер заголовков.169170Новое в версии 3.3.171172#### `log_request(code='-', size='-')`173174Записывает в журнал принятый (успешный) запрос. Параметр *code* должен задавать числовой код HTTP, связанный с ответом. Если размер ответа доступен, его следует передать как параметр *size*.175176#### `log_error(...)`177178Записывает в журнал ошибку, когда запрос не может быть выполнен. По умолчанию передаёт сообщение в [`log_message()`](https://python-all.ru/3.9/library/http.server.html#http.server.BaseHTTPRequestHandler.log_message), поэтому принимает те же аргументы (*format* и дополнительные значения).179180#### `log_message(format, ...)`181182Записывает произвольное сообщение в `sys.stderr`. Обычно этот метод переопределяют, чтобы создать собственные механизмы логирования ошибок. Аргумент *format* – это стандартная форматная строка в стиле printf, в которую дополнительные аргументы [`log_message()`](https://python-all.ru/3.9/library/http.server.html#http.server.BaseHTTPRequestHandler.log_message) подставляются в качестве входных данных для форматирования. IP-адрес клиента и текущая дата и время добавляются в начало каждого сообщения.183184#### `version_string()`185186Возвращает строку версии серверного программного обеспечения. Это комбинация атрибутов [`server_version`](https://python-all.ru/3.9/library/http.server.html#http.server.BaseHTTPRequestHandler.server_version) и [`sys_version`](https://python-all.ru/3.9/library/http.server.html#http.server.BaseHTTPRequestHandler.sys_version).187188#### `date_time_string(timestamp=None)`189190Возвращает дату и время, заданные *timestamp* (который должен быть `None` или в формате, возвращаемом [`time.time()`](https://python-all.ru/3.9/library/time.html#time.time)), отформатированные для заголовка сообщения. Если *timestamp* опущен, используются текущие дата и время.191192Результат выглядит как `'Sun, 06 Nov 1994 08:49:37 GMT'`.193194#### `log_date_time_string()`195196Возвращает текущие дату и время, отформатированные для логирования.197198#### `address_string()`199200Возвращает адрес клиента.201202Изменено в версии 3.3: Ранее выполнялся поиск по имени. Чтобы избежать задержек разрешения имён, теперь всегда возвращается IP-адрес.203204#### `class http.server.SimpleHTTPRequestHandler(request, client_address, server, directory=None)`205206Этот класс обслуживает файлы из каталога *directory* и ниже или из текущего каталога, если *directory* не указан, напрямую отображая структуру каталогов в HTTP-запросы.207208Новое в версии 3.7: Параметр *directory*.209210Изменено в версии 3.9: Параметр *directory* теперь принимает [объект, подобный пути](https://python-all.ru/3.9/glossary.html#term-path-like-object).211212Бо́льшая часть работы, например разбор запроса, выполняется базовым классом [`BaseHTTPRequestHandler`](https://python-all.ru/3.9/library/http.server.html#http.server.BaseHTTPRequestHandler). Этот класс реализует функции [`do_GET()`](https://python-all.ru/3.9/library/http.server.html#http.server.SimpleHTTPRequestHandler.do_GET) и [`do_HEAD()`](https://python-all.ru/3.9/library/http.server.html#http.server.SimpleHTTPRequestHandler.do_HEAD).213214Следующие атрибуты определены на уровне класса [`SimpleHTTPRequestHandler`](https://python-all.ru/3.9/library/http.server.html#http.server.SimpleHTTPRequestHandler):215216#### `server_version`217218Это будет `"SimpleHTTP/" + __version__`, где `__version__` определён на уровне модуля.219220#### `extensions_map`221222Словарь, сопоставляющий расширения с MIME-типами, содержит пользовательские переопределения для системных сопоставлений по умолчанию. Сопоставление используется без учёта регистра, поэтому должно содержать только ключи в нижнем регистре.223224Изменено в версии 3.9: Этот словарь больше не заполняется системными сопоставлениями по умолчанию, а содержит только переопределения.225226Класс [`SimpleHTTPRequestHandler`](https://python-all.ru/3.9/library/http.server.html#http.server.SimpleHTTPRequestHandler) определяет следующие методы:227228#### `do_HEAD()`229230Этот метод обслуживает тип запроса `'HEAD'`: он отправляет заголовки, которые отправил бы для эквивалентного запроса `GET`. Смотрите метод [`do_GET()`](https://python-all.ru/3.9/library/http.server.html#http.server.SimpleHTTPRequestHandler.do_GET) для более полного объяснения возможных заголовков.231232#### `do_GET()`233234Запрос сопоставляется с локальным файлом путём интерпретации запроса как пути относительно текущего рабочего каталога.235236Если запрос был сопоставлен с каталогом, то в этом каталоге ищется файл с именем `index.html` или `index.htm` (именно в таком порядке). Если файл найден, возвращается его содержимое; в противном случае формируется список содержимого каталога вызовом метода `list_directory()`. Этот метод использует [`os.listdir()`](https://python-all.ru/3.9/library/os.html#os.listdir) для обхода каталога и возвращает ответ с ошибкой `404`, если [`listdir()`](https://python-all.ru/3.9/library/os.html#os.listdir) завершается неудачей.237238Если запрос был сопоставлен с файлом, он открывается. Любое [`OSError`](https://python-all.ru/3.9/library/exceptions.html#OSError) исключение при открытии запрошенного файла преобразуется в `404`, `'File not found'` ошибку. Если в запросе был `'If-Modified-Since'` заголовок, и файл не изменялся после этого времени, отправляется ответ `304`, `'Not Modified'`. В противном случае тип содержимого определяется вызовом метода `guess_type()`, который в свою очередь использует переменную *extensions\_map*, и возвращается содержимое файла.239240Выводится заголовок `'Content-type:'` с определённым типом содержимого, за которым следуют заголовок `'Content-Length:'` с размером файла и заголовок `'Last-Modified:'` со временем изменения файла.241242Затем следует пустая строка, обозначающая конец заголовков, и после этого выводится содержимое файла. Если MIME-тип файла начинается с `text/`, файл открывается в текстовом режиме; в противном случае используется двоичный режим.243244Для примера использования обратитесь к реализации вызова функции [`test()`](https://python-all.ru/3.9/library/test.html#module-test) в модуле [`http.server`](https://python-all.ru/3.9/library/http.server.html#module-http.server).245246Изменено в версии 3.7: Поддержка заголовка `'If-Modified-Since'`.247248Класс [`SimpleHTTPRequestHandler`](https://python-all.ru/3.9/library/http.server.html#http.server.SimpleHTTPRequestHandler) можно использовать следующим образом для создания очень простого веб-сервера, раздающего файлы из текущего каталога:249250```python251import http.server252import socketserver253254PORT = 8000255256Handler = http.server.SimpleHTTPRequestHandler257258with socketserver.TCPServer(("", PORT), Handler) as httpd:259 print("serving at port", PORT)260 httpd.serve_forever()261```262263[`http.server`](https://python-all.ru/3.9/library/http.server.html#module-http.server) также может быть вызван напрямую с помощью параметра [`-m`](https://python-all.ru/3.9/using/cmdline.html#cmdoption-m) интерпретатора. Подобно предыдущему примеру, этот сервер обслуживает файлы относительно текущей директории:264265```python266python -m http.server267```268269По умолчанию сервер прослушивает порт 8000. Значение по умолчанию можно переопределить, передав желаемый номер порта в качестве аргумента:270271```python272python -m http.server 9000273```274275По умолчанию сервер привязывается ко всем интерфейсам. Параметр `-b/--bind` указывает конкретный адрес, к которому он должен привязаться. Поддерживаются как IPv4, так и IPv6 адреса. Например, следующая команда заставляет сервер привязываться только к localhost:276277```python278python -m http.server --bind 127.0.0.1279```280281Новое в версии 3.4: Был введён аргумент `--bind`.282283Новое в версии 3.8: Аргумент `--bind` улучшен для поддержки IPv6284285По умолчанию сервер использует текущую директорию. Параметр `-d/--directory` указывает директорию, из которой следует обслуживать файлы. Например, следующая команда использует конкретную директорию:286287```python288python -m http.server --directory /tmp/289```290291Новое в версии 3.7: Был введён аргумент `--directory`.292293#### `class http.server.CGIHTTPRequestHandler(request, client_address, server)`294295Этот класс используется для обслуживания как файлов, так и вывода CGI-скриптов из текущего каталога и подкаталогов. Обратите внимание, что отображение иерархической структуры HTTP на локальную структуру каталогов выполняется точно так же, как в [`SimpleHTTPRequestHandler`](https://python-all.ru/3.9/library/http.server.html#http.server.SimpleHTTPRequestHandler).296297> **Примечание**298>299> CGI-скрипты, запускаемые классом [`CGIHTTPRequestHandler`](https://python-all.ru/3.9/library/http.server.html#http.server.CGIHTTPRequestHandler), не могут выполнять перенаправления (HTTP код 302), потому что код 200 (вывод скрипта следует) отправляется до выполнения CGI-скрипта. Это опережает код состояния.300301Однако класс будет запускать CGI-скрипт вместо того, чтобы отдавать его как файл, если он определит, что это CGI-скрипт. Используются только каталогизированные CGI – другая распространённая конфигурация сервера (обработка специальных расширений как обозначающих CGI-скрипты) не применяется.302303Функции `do_GET()` и `do_HEAD()` изменены таким образом, чтобы запускать CGI-скрипты и выдавать их результат вместо отдачи файлов, если запрос ведёт в каталог, расположенный ниже пути `cgi_directories`.304305Класс [`CGIHTTPRequestHandler`](https://python-all.ru/3.9/library/http.server.html#http.server.CGIHTTPRequestHandler) определяет следующий элемент данных:306307#### `cgi_directories`308309По умолчанию имеет значение `['/cgi-bin', '/htbin']` и описывает каталоги, которые следует считать содержащими CGI-скрипты.310311Класс [`CGIHTTPRequestHandler`](https://python-all.ru/3.9/library/http.server.html#http.server.CGIHTTPRequestHandler) определяет следующий метод:312313#### `do_POST()`314315Этот метод обслуживает запросы типа `'POST'`, разрешённые только для CGI- скриптов. При попытке выполнить POST на не-CGI URL выводится ошибка 501: «Can only POST to CGI scripts».316317Обратите внимание: из соображений безопасности CGI-скрипты будут запускаться с UID пользователя nobody. Проблемы с CGI-скриптом приведут к ошибке 403.318319[`CGIHTTPRequestHandler`](https://python-all.ru/3.9/library/http.server.html#http.server.CGIHTTPRequestHandler) можно включить в командной строке, передав параметр `--cgi`:320321```python322python -m http.server --cgi323```324325## Вопросы безопасности326327[`SimpleHTTPRequestHandler`](https://python-all.ru/3.9/library/http.server.html#http.server.SimpleHTTPRequestHandler) будет следовать по символическим ссылкам при обработке запросов, что позволяет отдавать файлы за пределами указанного каталога.328329В более ранних версиях Python не удалялись управляющие символы из сообщений журнала, выводимых в stderr из `python -m http.server` или реализации по умолчанию [`BaseHTTPRequestHandler`](https://python-all.ru/3.9/library/http.server.html#http.server.BaseHTTPRequestHandler) `.log_message`. Это могло позволить удалённым клиентам, подключающимся к вашему серверу, отправлять вредоносные управляющие коды на ваш терминал.330331Новое в версии 3.9.16: очистка управляющих символов из сообщений журнала332