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'содержит следующие переменные экземпляра:
- 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 Content205 Reset Content304 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: Соображения безопасности