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 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: Соображения безопасности