http.server
— HTTP серверы¶
Исходный код: Lib/http/server.py
Модуль определяет классы для реализации HTTP-серверов (веб-серверов).
Предупреждение
http.server
не рекомендован для продакшен. Он реализует только
базовые проверки безопасности.
Один класс, HTTPServer
, это socketserver.TCPServer
подкласс. Он создает
и прослушивает HTTP сокет, отправляя запросы обработчику. Код для создания и запуска
сервера выглядит следующим образом:
def run(server_class=HTTPServer, handler_class=BaseHTTPRequestHandler):
server_address = ('', 8000)
httpd = server_class(server_address, handler_class)
httpd.serve_forever()
-
class
http.server.
HTTPServer
(server_address, RequestHandlerClass)¶ Класс основывается на классе
TCPServer
, храня адрес сервера как переменные сущность по имениserver_name
иserver_port
. Сервер доступен обработчику, как правило, через переменнуюserver
сущность обработчика.
-
class
http.server.
ThreadingHTTPServer
(server_address, RequestHandlerClass)¶ Класс идентичен HTTPServer, но использует потоки для обработки запросов с помощью
ThreadingMixIn
. Это полезно для обработки веб-браузеров перед открытием сокеты, на которомHTTPServer
будет ждать бесконечно долго.Добавлено в версии 3.7.
HTTPServer
и ThreadingHTTPServer
должны быть даны RequestHandlerClass на создание экземпляра, из
которых данный модуль предоставляет три различных варианта:
-
class
http.server.
BaseHTTPRequestHandler
(request, client_address, server)¶ Класс - используемый, чтобы обработать запросы HTTP, которые прибывают в сервер. Сам по себе он не может отвечать ни на какие фактические запросы HTTP; он должен быть подклассирован для обработки каждого метода запроса (например, GET или POST).
BaseHTTPRequestHandler
предоставляет ряд переменных класса и сущность, а также методы для использования подклассы.Обработчик проанализирует запрос и заголовки, а затем вызовет метод, специфичный для типа запроса. Имя метода создается на основе запроса. Например, для метода запроса
SPAM
, методdo_SPAM()
назовут без аргументов. Вся релевантная информация хранится в переменных сущности обработчика. Подклассам не нужно переопределять или расширять метод__init__()
.У
BaseHTTPRequestHandler
есть следующие переменные сущности:-
client_address
¶ Содержит кортеж формы
(host, port)
со ссылкой на адрес клиента.
-
server
¶ Содержит сущность сервера.
-
close_connection
¶ Логическое значение, которое должно быть установлено перед
handle_one_request()
возвращает, указывая, может ли ожидаться другой запрос или необходимо завершить подключение.
-
requestline
¶ Содержит представление строка строки запроса HTTP. Завершающий CRLF очищается. Это атрибут должно быть установлено
handle_one_request()
. Если действительная строка запроса не была обработана, она должна быть установлена в пустое строка.
-
command
¶ Содержит команду (тип запроса). Например,
'GET'
.
-
path
¶ Содержит путь запроса.
-
request_version
¶ Содержит строковую версию из запроса. Например,
'HTTP/1.0'
.
-
headers
¶ Содержит сущность класса, указанного переменной класса
MessageClass
. Эта сущность анализирует и управляет заголовками в HTTP-запросе. Функцияparse_headers()
отhttp.client
- используемый, чтобы разобрать заголовки, и это требует, чтобы запрос HTTP предоставил действительный заголовок стиля RFC 2822.
-
rfile
¶ Входной поток
io.BufferedIOBase
, готовый к считыванию с начала дополнительных входных данных.
-
wfile
¶ Содержит выходной поток для записи ответа обратно клиенту. Надлежащая приверженность протоколу HTTP должна быть используемый, в письме к этому потоку, чтобы достигнуть успешной межоперации с клиентами HTTP.
Изменено в версии 3.6: Это поток
io.BufferedIOBase
.
BaseHTTPRequestHandler
имеет следующие атрибуты:-
server_version
¶ Указывает версию программного обеспечения сервера. Возможно, потребуется переопределить это. Формат состоит из нескольких разделенных пробелами строки, где каждый строка имеет имя формы [/version]. Например,
'BaseHTTP/0.2'
.
-
sys_version
¶ Содержит версию Python системы в форме, используемой методом
version_string
и переменной классаserver_version
. Например,'Python/1.4'
.
-
error_message_format
¶ Определяет форматную строку, которая должна быть используемый методом
send_error()
для строительства ошибочного ответа клиенту. По умолчанию строка заполняется переменными изresponses
на основе статуса код, переданногоsend_error()
.
-
error_content_type
¶ Задает HTTP-заголовок типа контента для ответов на ошибки, отправленных клиенту. Дефолт значение является
'text/html'
.
-
protocol_version
¶ Указывает версию протокола HTTP используемый в ответах. Если установлено значение
'HTTP/1.1'
, сервер разрешит постоянные HTTP-подключения; однако, ваш сервер всегда должен включаеть точный заголовокContent-Length
(использующийsend_header()
) во всех его ответах клиентам. Для обратной совместимости параметр по умолчанию имеет значение'HTTP/1.0'
.
-
MessageClass
¶ Задает класс типа
email.message.Message
для синтаксического анализа заголовков HTTP. Как правило, это не переопределяется, и по умолчанию устанавливается значениеhttp.client.HTTPMessage
.
-
responses
¶ Этот атрибут содержит отображение ошибки целые числа код к кортежам с двумя элементами, содержащим короткое и длинное сообщение. Например,
{code: (shortmessage, longmessage)}
. shortmessage обычно - используемый, поскольку message вводят ошибочный ответ и longmessage как ключ explain. Это - используемыйsend_response_only()
и методамиsend_error()
.
У
BaseHTTPRequestHandler
сущность есть следующий методы:-
handle
()¶ Вызов
handle_one_request()
единожды (или, если постоянные подключения включены, многократно) обрабатывает поступающие запросы HTTP. Вам никогда не нужно переопределять его; вместо этого внедрите соответствующие методыdo_*()
.
-
handle_one_request
()¶ Этот метод будет анализировать и отправлять запрос соответствующему методу
do_*()
. Тебе никогда не нужно переопределять это.
-
handle_expect_100
()¶ Когда совместимый с HTTP/1.1 сервер получает заголовок запроса
Expect: 100-continue
, он отвечает100 Continue
, за которым следуют заголовки200 OK
. Этот метод можно переопределить, чтобы вызвать ошибку, если сервер не хочет продолжения работы клиента. Например, сервер может отправить417 Expectation Failed
в качестве заголовка ответа иreturn False
.Добавлено в версии 3.2.
-
send_error
(code, message=None, explain=None)¶ Отправляет клиенту и записывает в журнал полный ответ об ошибке. Числовой code определяет ошибку HTTP код с message как дополнительное, короткое, человекочитаемое описание ошибки. Аргумент explain может быть используемый, чтобы обеспечить более подробную информацию об ошибке; он будет отформатирован с использованием
error_message_format
атрибут и выдан после полного набора заголовков в качестве тела ответа.responses
атрибут считает дефолт значения для message и explain, который будет используемый, если нет значение будет обеспечен; для неизвестного коды дефолт значение для обоих - строка???
. Тело будет пусто, если метод будет HEAD или ответом, код - одно из следующего:1xx
,204 No Content
,205 Reset Content
,304 Not Modified
.Изменено в версии 3.4: Ответ на ошибку включает заголовок Content-Length. Добавлен аргумент explain.
-
send_response
(code, message=None)¶ Добавляет заголовок ответа в буфер заголовков и регистрирует принятый запрос. Строка ответа HTTP записывается во внутренний буфер, за которым следуют заголовки Server и Date. значения для этих двух заголовков берутся из методов
version_string()
иdate_time_string()
соответственно. Если сервер не намерен посылать какие-либо другие заголовки с помощью методаsend_header()
, то заsend_response()
должен последовать вызовend_headers()
.Изменено в версии 3.3: Заголовки сохранены к внутреннему буферу, и
end_headers()
нужно вызывать явно.
-
send_header
(keyword, value)¶ Добавляет заголовок HTTP во внутренний буфер, который будет записываться в выходной поток при вызове
end_headers()
илиflush_headers()
. keyword должен указать заголовок ключевой, а value - его значение. Обратите внимание, что, после того, как требования send_header сделаны,end_headers()
ДОЛЖЕН вызываться, чтобы закончить операцию.Изменено в версии 3.2: Заголовки хранятся во внутреннем буфере.
-
send_response_only
(code, message=None)¶ Отправляет только заголовок ответа, используемый для целей, когда ответ
100 Continue
отправляется сервером клиенту. Заголовки не буферизованы и отправили непосредственно выходной поток. Если message не указан, отправляется HTTP- сообщение, соответствующее ответному code.Добавлено в версии 3.2.
-
end_headers
()¶ Добавление пустой строки (указывающей конец заголовков HTTP в ответе) в буфер заголовков и вызовы
flush_headers()
.Изменено в версии 3.2: Буферизованные заголовки записываются в выходной поток.
-
flush_headers
()¶ Финализировать отправку заголовков в выходной поток и очистить внутренний буфер заголовков.
Добавлено в версии 3.3.
-
log_request
(code='-', size='-')¶ Регистрирует принятый (успешный) запрос. code должен указать числовой HTTP- код, связанный с ответом. Если доступен размер ответа, он должен быть передан в качестве параметра size.
-
log_error
(...)¶ Регистрирует ошибку, когда запрос не может быть выполнен. По умолчанию оно передает сообщение
log_message()
, поэтому оно принимает те же аргументы (format и дополнительные значения).
-
log_message
(format, ...)¶ Регистрирует произвольное сообщение к
sys.stderr
. Это обычно переопределяется для создания пользовательских механизмов логирование ошибок. Аргумент format является стандартным форматом строка в стиле printf, где дополнительные аргументы кlog_message()
применяются в качестве входных данных для форматирования. IP-адрес клиента и текущая дата и время являются префиксами каждого зарегистрированного сообщения.
-
version_string
()¶ Возвращает версию программного обеспечения сервера строка. Это сочетание
server_version
иsys_version
атрибуты.
-
date_time_string
(timestamp=None)¶ Возвращает дату и время, заданные timestamp (которые должны быть
None
или в формате возвращенный поtime.time()
), отформатированные для заголовка сообщения. Если timestamp опущен, используется текущая дата и время.Результат выглядит как
'Sun, 06 Nov 1994 08:49:37 GMT'
.
-
log_date_time_string
()¶ Возвращает текущую дату и время, отформатированные для логирование.
-
address_string
()¶ Возвращает адрес клиента.
Изменено в версии 3.3: Ранее выполнялся поиск имен. Чтобы избежать задержек разрешения имен, теперь он всегда возвращает IP-адрес.
-
-
class
http.server.
SimpleHTTPRequestHandler
(request, client_address, server, directory=None)¶ Класс обслуживает файлы из текущего каталога и ниже, непосредственно сопоставляя структуру каталога с запросами HTTP.
Большая работа, такая как парсинг запрос, сделана базовым классом
BaseHTTPRequestHandler
. Класс реализует функцииdo_GET()
иdo_HEAD()
.Следующее определено как уровень класса атрибуты
SimpleHTTPRequestHandler
:-
server_version
¶ Это будет
"SimpleHTTP/" + __version__
, где__version__
определяется на уровне модуля.
-
extensions_map
¶ Суффиксы сопоставления словарей в типы MIME. Значение по умолчанию обозначается пустой строка и считается
application/octet-stream
. Отображение - случай нечувствительно используемый и так должно содержать, только печатал строчными литерами ключи.
-
directory
¶ Если не указан, каталог для обслуживания является текущим рабочим каталогом.
Класс
SimpleHTTPRequestHandler
определяет следующие методы:-
do_HEAD
()¶ Этот метод обслуживает тип запроса
'HEAD'
: он отправляет заголовки для эквивалентного запросаGET
. Более полное описание возможных заголовков см. в методеdo_GET()
.
-
do_GET
()¶ Запрос сопоставляется с файлом локальная путем интерпретации запроса как пути относительно текущего рабочего каталога.
Если запрос был сопоставлен с каталогом, каталог проверяется на наличие файла с именем
index.html
илиindex.htm
(в этом порядке). Если найдено, содержимое файла равно возвращенный; в противном случае список каталогов генерируется путем вызова методаlist_directory()
. Этот метод используетos.listdir()
для сканирования каталога и возвращает ответ на ошибку404
в случае сбояlistdir()
.Если запрос был сопоставлен с файлом, он открывается. Любое исключение
OSError
при открытии запрошенного файла сопоставляется с ошибкой404
,'File not found'
. Если в запросе был заголовок'If-Modified-Since'
, и файл не был изменен после этого времени, то ответ304
,'Not Modified'
. В противном случае тип содержимого угадывается путем вызова методаguess_type()
, который, в свою очередь, использует переменную extensions_map, а содержимое файла возвращенный.Выводится заголовок
'Content-type:'
с предполагаемым типом контента, за которым следует заголовок'Content-Length:'
с размером файла и заголовок'Last-Modified:'
со временем изменения файла.Затем следует пустая строка, обозначающая конец заголовков, а затем выводится содержимое файла. Если тип файла MIME начинается с
text/
, файл открывается в текстовом режиме; в противном случае двоичный режим является используемый.Например, см. реализацию вызова функции
test()
в модулеhttp.server
.Изменено в версии 3.7: Поддержка заголовка
'If-Modified-Since'
.
-
Класс SimpleHTTPRequestHandler
может быть используемый следующим образом,
чтобы создать очень простой webserver служащие файлы относительно текущего каталога:
import http.server
import socketserver
PORT = 8000
Handler = http.server.SimpleHTTPRequestHandler
with socketserver.TCPServer(("", PORT), Handler) as httpd:
print("serving at port", PORT)
httpd.serve_forever()
http.server
также может быть вызван непосредственно с помощью переключателя
-m
интерпретатор с аргументом port number
. Как и в предыдущем примере, он
обслуживает файлы относительно текущего каталога:
python -m http.server 8000
По умолчанию сервер привязывает себя ко всем интерфейсам. Параметр -b/--bind
указывает конкретный адрес, с которым он должен быть связан. Поддерживаются как
адреса IPv4, так и адреса IPv6. Например, следующая команда вызывает привязку
сервера только к localhost:
python -m http.server 8000 --bind 127.0.0.1
Добавлено в версии 3.4: --bind
введен аргумент.
Добавлено в версии 3.8: --bind
аргумент расширен для поддержки IPv6
По умолчанию сервер использует текущий каталог. Параметр -d/--directory
указывает
каталог, в котором он должен обслуживать файлы. Например, следующая команда
использует определенный каталог:
python -m http.server --directory /tmp/
Добавлено в версии 3.7: --directory
укажите альтернативный каталог
-
class
http.server.
CGIHTTPRequestHandler
(request, client_address, server)¶ Класс используется для выполнения файлов или сценариев CGI из текущего каталога и ниже. Обратите внимание, что сопоставление иерархической структуры HTTP со структурой каталогов локальная точно так же, как в
SimpleHTTPRequestHandler
.Примечание
Сценарии CGI, выполняемые классом
CGIHTTPRequestHandler
, не могут выполнять перенаправления (HTTP код 302), поскольку код 200 (вывод сценария следует) посылается до выполнения сценария CGI. Это предопределяет статус код.Однако класс будет выполнять сценарий CGI вместо того, чтобы служить в качестве файла, если он предполагает, что он является сценарием CGI. Только основанные на справочнике CGI - используемый —, другая общая конфигурация сервера состоит в том, чтобы рассматривать специальные расширения как обозначение сценариев CGI.
Функции
do_GET()
иdo_HEAD()
модифицируются для выполнения сценариев CGI и обслуживания выходных данных вместо обслуживания файлов, если запрос ведет куда- то ниже путиcgi_directories
.CGIHTTPRequestHandler
определяет следующий элемент данных:-
cgi_directories
¶ По умолчанию используется параметр
['/cgi-bin', '/htbin']
и описываются каталоги, которые следует рассматривать как содержащие сценарии CGI.
CGIHTTPRequestHandler
определяет следующий method:-
do_POST
()¶ Этот метод обслуживает тип запроса
'POST'
, разрешенный только для сценариев CGI. Ошибка 501 «Может только POST в CGI скриптах» выводится при попытке POST на URL-адрес, не являющийся CGI.
Следует отметить, что сценарии CGI будут запускаться с UID пользователя nobody, из соображений безопасности. Проблемы со сценарием CGI будут преобразованы в ошибку 403.
-
CGIHTTPRequestHandler
может быть включен в командной строке, передав опцию --cgi
:
python -m http.server --cgi 8000