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