http.server — HTTP-серверы

Исходный код: Lib/http/server.py


Этот модуль определяет классы для реализации HTTP-серверов.

Предупреждение

http.server не рекомендуется для производства. Он реализует только basic security checks.

Availability: это не Emscripten, это был не я.

Этот модуль не работает или недоступен на платформах WebAssembly wasm32-emscripten и wasm32-wasi. Дополнительную информацию смотрите в разделе Платформы веб-сборки.

Один класс, 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)

Этот класс идентичен HTTP-серверу, но использует потоки для обработки запросов с помощью 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

Contains the server instance.

close_connection

handle_one_request() содержит следующие переменные экземпляра:

requestline

handle_one_request() содержит следующие переменные экземпляра:

command

'GET' содержит следующие переменные экземпляра:

path

path содержит RFC 3986 следующие path переменные hier-part экземпляра query :

request_version

'HTTP/1.0' содержит следующие переменные экземпляра:

headers

MessageClass содержит parse_headers() следующие http.client переменные RFC 2822 экземпляра:

rfile

io.BufferedIOBase содержит следующие переменные экземпляра:

wfile

Contains the output stream for writing a response back to the client. Proper adherence to the HTTP protocol must be used when writing to this stream in order to achieve successful interoperation with HTTP clients.

Изменено в версии 3.6: io.BufferedIOBase содержит следующие переменные экземпляра:

BaseHTTPRequestHandler содержит следующие переменные экземпляра:

server_version

'BaseHTTP/0.2' содержит следующие переменные экземпляра:

sys_version

version_string содержит server_version следующие 'Python/1.4' переменные экземпляра:

error_message_format

Указывает строку формата, которая должна использоваться методом send_error() для создания ответа об ошибке для клиента. По умолчанию строка заполняется переменными из responses на основе кода состояния, который был передан в send_error().

error_content_type

Определяет HTTP-заголовок Content-Type для ответов об ошибках, отправляемых клиенту. Значение по умолчанию - '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)

Когда сервер, соответствующий стандарту HTTP/1.1, получает заголовок запроса error_message_format, он выдает в ответ responses, за которым следуют заголовки ???. Этот метод можно переопределить, чтобы вызвать ошибку, если сервер не хочет, чтобы клиент продолжал работу. Например, сервер может выбрать отправку 1xx в качестве заголовка ответа и 204 No Content 205 Reset Content 304 Not Modified .

Изменено в версии 3.4: Когда сервер, соответствующий стандарту HTTP/1.1, получает заголовок запроса , он выдает в ответ , за которым следуют заголовки . Этот метод можно переопределить, чтобы вызвать ошибку, если сервер не хочет, чтобы клиент продолжал работу. Например, сервер может выбрать отправку в качестве заголовка ответа и .

send_response(code, message=None)

Когда сервер, соответствующий стандарту HTTP/1.1, получает заголовок запроса version_string(), он выдает в ответ date_time_string(), за которым следуют заголовки send_header(). Этот метод можно переопределить, чтобы вызвать ошибку, если сервер не хочет, чтобы клиент продолжал работу. Например, сервер может выбрать отправку send_response() в качестве заголовка ответа и end_headers().

Изменено в версии 3.3: Когда сервер, соответствующий стандарту HTTP/1.1, получает заголовок запроса end_headers(), он выдает в ответ , за которым следуют заголовки . Этот метод можно переопределить, чтобы вызвать ошибку, если сервер не хочет, чтобы клиент продолжал работу. Например, сервер может выбрать отправку в качестве заголовка ответа и .

send_header(keyword, value)

Добавляет HTTP-заголовок во внутренний буфер, который будет записан в выходной поток при вызове end_headers() или flush_headers(). keyword должен указывать ключевое слово заголовка, а value - его значение. Обратите внимание, что после выполнения вызовов send_header НЕОБХОДИМО вызвать end_headers() для завершения операции.

Изменено в версии 3.2: Добавляет HTTP-заголовок во внутренний буфер, который будет записан в выходной поток при вызове или . keyword должен указывать ключевое слово заголовка, а value - его значение. Обратите внимание, что после выполнения вызовов send_header НЕОБХОДИМО вызвать для завершения операции.

send_response_only(code, message=None)

Добавляет HTTP-заголовок во внутренний буфер, который будет записан в выходной поток при вызове 100 Continue или . keyword должен указывать ключевое слово заголовка, а value - его значение. Обратите внимание, что после выполнения вызовов send_header НЕОБХОДИМО вызвать для завершения операции.

Добавлено в версии 3.2.

end_headers()

Добавляет HTTP-заголовок во внутренний буфер, который будет записан в выходной поток при вызове flush_headers() или . keyword должен указывать ключевое слово заголовка, а value - его значение. Обратите внимание, что после выполнения вызовов send_header НЕОБХОДИМО вызвать для завершения операции.

Изменено в версии 3.2: Добавляет HTTP-заголовок во внутренний буфер, который будет записан в выходной поток при вызове или . keyword должен указывать ключевое слово заголовка, а value - его значение. Обратите внимание, что после выполнения вызовов send_header НЕОБХОДИМО вызвать для завершения операции.

flush_headers()

Добавляет HTTP-заголовок во внутренний буфер, который будет записан в выходной поток при вызове или . keyword должен указывать ключевое слово заголовка, а value - его значение. Обратите внимание, что после выполнения вызовов send_header НЕОБХОДИМО вызвать для завершения операции.

Добавлено в версии 3.3.

log_request(code='-', size='-')

Добавляет HTTP-заголовок во внутренний буфер, который будет записан в выходной поток при вызове или . keyword должен указывать ключевое слово заголовка, а value - его значение. Обратите внимание, что после выполнения вызовов send_header НЕОБХОДИМО вызвать для завершения операции.

log_error(...)

Добавляет HTTP-заголовок во внутренний буфер, который будет записан в выходной поток при вызове log_message() или . keyword должен указывать ключевое слово заголовка, а value - его значение. Обратите внимание, что после выполнения вызовов send_header НЕОБХОДИМО вызвать для завершения операции.

log_message(format, ...)

Добавляет HTTP-заголовок во внутренний буфер, который будет записан в выходной поток при вызове sys.stderr или log_message(). keyword должен указывать ключевое слово заголовка, а value - его значение. Обратите внимание, что после выполнения вызовов send_header НЕОБХОДИМО вызвать для завершения операции.

version_string()

Добавляет HTTP-заголовок во внутренний буфер, который будет записан в выходной поток при вызове server_version или sys_version. keyword должен указывать ключевое слово заголовка, а value - его значение. Обратите внимание, что после выполнения вызовов send_header НЕОБХОДИМО вызвать для завершения операции.

date_time_string(timestamp=None)

Добавляет HTTP-заголовок во внутренний буфер, который будет записан в выходной поток при вызове None или time.time(). keyword должен указывать ключевое слово заголовка, а value - его значение. Обратите внимание, что после выполнения вызовов send_header НЕОБХОДИМО вызвать для завершения операции.

Добавляет HTTP-заголовок во внутренний буфер, который будет записан в выходной поток при вызове 'Sun, 06 Nov 1994 08:49:37 GMT' или . keyword должен указывать ключевое слово заголовка, а value - его значение. Обратите внимание, что после выполнения вызовов send_header НЕОБХОДИМО вызвать для завершения операции.

log_date_time_string()

Возвращает текущую дату и время, отформатированные для ведения журнала.

address_string()

Возвращает адрес клиента.

Изменено в версии 3.3: Ранее выполнялся поиск по имени. Чтобы избежать задержек с разрешением имен, теперь всегда возвращается IP-адрес.

class http.server.SimpleHTTPRequestHandler(request, client_address, server, directory=None)

Этот класс обрабатывает файлы из каталога directory и ниже, или из текущего каталога, если directory не указан, напрямую сопоставляя структуру каталогов с HTTP-запросами.

Изменено в версии 3.7: Добавлен параметр directory.

Изменено в версии 3.9: Параметр directory принимает значение path-like object.

Большая часть работы, например, анализ запроса, выполняется базовым классом BaseHTTPRequestHandler. Этот класс реализует функции do_GET() и do_HEAD().

Следующие атрибуты определены как атрибуты уровня класса SimpleHTTPRequestHandler:

server_version

Это будет "SimpleHTTP/" + __version__, где __version__ определено на уровне модуля.

extensions_map

Словарь, преобразующий суффиксы в MIMEtypes, содержит пользовательские переопределения для системных сопоставлений по умолчанию. Сопоставление используется без учета регистра и поэтому должно содержать только строчные ключи.

Изменено в версии 3.9: Этот словарь больше не содержит системных сопоставлений по умолчанию, а содержит только переопределения.

Класс 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:'. Если в запросе был заголовок и по истечении этого времени файл не был изменен, отправляется ответ , . В противном случае тип содержимого определяется вызовом метода , который, в свою очередь, использует переменную extensions_map, и возвращается содержимое файла.

Затем следует пустая строка, обозначающая конец заголовков, и выводится содержимое файла. Если MIME-тип файла начинается с text/, файл открывается в текстовом режиме; в противном случае используется двоичный режим.

Затем следует пустая строка, обозначающая конец заголовков, и выводится содержимое файла. Если MIME-тип файла начинается с test, файл Lib/http/server.py открывается в текстовом режиме; в противном случае используется двоичный режим.

Изменено в версии 3.7: Затем следует пустая строка, обозначающая конец заголовков, и выводится содержимое файла. Если MIME-тип файла начинается с 'If-Modified-Since', файл открывается в текстовом режиме; в противном случае используется двоичный режим.

Класс SimpleHTTPRequestHandler можно использовать следующим образом, чтобы создать очень простой веб-сервер, обслуживающий файлы, относящиеся к текущему каталогу:

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 интерпретатора. Как и в предыдущем примере, здесь используются файлы, относящиеся к текущему каталогу:

python -m http.server

По умолчанию сервер прослушивает порт 8000. Значение по умолчанию можно изменить, передав в качестве аргумента желаемый номер порта:

python -m http.server 9000

По умолчанию сервер привязывается ко всем интерфейсам. Параметр -b/--bind указывает конкретный адрес, к которому он должен привязываться. Поддерживаются как адреса IPv4, так и IPv6. Например, следующая команда заставляет сервер привязываться только к локальному хосту:

python -m http.server --bind 127.0.0.1

Изменено в версии 3.4: Добавлена опция --bind.

Изменено в версии 3.8: Поддерживайте IPv6 в опции --bind.

По умолчанию сервер использует текущий каталог. Параметр -d/--directory указывает каталог, в который он должен отправлять файлы. Например, следующая команда использует определенный каталог:

python -m http.server --directory /tmp/

Изменено в версии 3.7: Добавлена опция --directory.

По умолчанию сервер поддерживает протокол HTTP/1.0. Параметр -p/--protocol указывает версию HTTP, которой соответствует сервер. Например, следующая команда запускает сервер, соответствующий протоколу HTTP/1.1:

python -m http.server --protocol HTTP/1.1

Изменено в версии 3.11: Добавлена опция --protocol.

class http.server.CGIHTTPRequestHandler(request, client_address, server)

Добавлена опция SimpleHTTPRequestHandler.

Примечание

Добавлена опция CGIHTTPRequestHandler.

Добавлена опция .

Добавлена опция do_GET() do_HEAD() cgi_directories .

Добавлена опция CGIHTTPRequestHandler.

cgi_directories

Добавлена опция ['/cgi-bin', '/htbin'].

Параметр CGIHTTPRequestHandler определяет следующий метод:

do_POST()

Этот метод выполняет запрос типа 'POST', разрешенный только для CGI-скриптов. Ошибка 501 «Возможна публикация только в CGI-скриптах» выводится при попытке публикации по URL, отличному от CGI.

Этот метод выполняет запрос типа , разрешенный только для CGI-скриптов. Ошибка 501 «Возможна публикация только в CGI-скриптах» выводится при попытке публикации по URL, отличному от CGI.

CGIHTTPRequestHandler можно включить в командной строке, указав параметр --cgi:

python -m http.server --cgi

Предупреждение

CGIHTTPRequestHandler и --cgi параметры командной строки не предназначены для использования ненадежными клиентами и могут быть уязвимы для взлома. Всегда используйте их в безопасной среде.

Соображения безопасности

:class:`SimpleHTTPRequestHandler`Соображения безопасности

python -m http.server``Соображения :class:`BaseHTTPRequestHandler`  безопасност ``.log_message и

Изменено в версии 3.11.1: Соображения безопасности

Вернуться на верх