import http.server http.server.SimpleHTTPRequestHandler(request, client_address, server, directory=None)
request
- запрос,client_address
- кортеж формы (host, port),server
- экземпляр сервера, directory=None
- обслуживаемый каталог (по умолчанию - текущий).Класс SimpleHTTPRequestHandler()
модуля http.server
обслуживает файлы из текущего каталога directory
, напрямую сопоставляя структуру каталогов с HTTP-запросами.
Большая часть работы, например анализ запроса, выполняется базовым классом BaseHTTPRequestHandler
.
Этот класс реализует методы .do_GET()
и .do_HEAD()
.
SimpleHTTPRequestHandler
:SimpleHTTPRequestHandler.server_version
:Атрибут SimpleHTTPRequestHandler.server_version
возвращает 'SimpleHTTP/' + __version__
, где __version__
определено на уровне модуля.
SimpleHTTPRequestHandler.extensions_map
:Атрибут SimpleHTTPRequestHandler.extensions_map
возвращает словарь, сопоставляющий суффиксы, в типы MIME, содержит пользовательские переопределения для системных сопоставлений по умолчанию.
Отображение используется без учета регистра и поэтому должно содержать только ключи в нижнем регистре.
Изменено в Python 3.9: этот словарь больше не заполняется системными сопоставлениями по умолчанию, а содержит только переопределения.
SimpleHTTPRequestHandler.directory
:Атрибут SimpleHTTPRequestHandler.directory
возвращает обслуживаемый каталог. Если не указано иное, то обслуживаемый каталог является текущим рабочим каталогом.
Изменено в Python 3.9: Принимает объект, похожий на путь, например pathlib.Path()
.
SimpleHTTPRequestHandler
.Класс SimpleHTTPRequestHandler
наследует все методы и атрибуты класса BaseHTTPRequestHandler
и определяет следующие дополнительные методы:
SimpleHTTPRequestHandler.do_HEAD()
:Метод SimpleHTTPRequestHandler.do_HEAD()
обслуживает тип запроса 'HEAD'
: он отправляет заголовки, которые потом отправит для эквивалентного запроса 'GET'
.
SimpleHTTPRequestHandler.do_GET()
:Метод SimpleHTTPRequestHandler.do_GET()
сопоставляет запрос с локальным файлом, интерпретируя запрос как путь относительно текущего рабочего каталога.
Если запрос был сопоставлен с каталогом, то каталог проверяется на наличие файла с именем index.html
или index.htm
(в таком порядке). В случае обнаружения возвращается содержимое файла. В противном случае создается список каталогов, путем вызова метода .list_directory()
. Этот метод использует функцию os.listdir()
для сканирования каталога и возвращает ответ об ошибке 404, если os.listdir()
не работает.
Если запрос был сопоставлен с файлом, он открывается. Любое исключение OSError
при открытии запрошенного файла сопоставляется с ошибкой 404
, 'File not found'
. Если в запросе был заголовок 'If-Modified-Since'
и файл не был изменен после этого времени, то отправляется ответ 304
, 'Not Modified'
. В противном случае тип содержимого угадывается путем вызова метода .guess_type()
, который, в свою очередь, использует переменную .extensions_map
, и возвращает содержимое файла.
Выводится заголовок 'Content-type: ...'
с предполагаемым типом содержимого, за которым следует заголовок 'Content-Length: ...'
с размером файла и заголовок 'Last-Modified: ...'
со временем модификации файла.
Затем следует пустая строка, обозначающая конец заголовков, а затем выводится содержимое файла. Если MIME-тип файла начинается с text/...
файл открывается в текстовом режиме, в противном случае используется двоичный режим.
Изменено в Python 3.7: Поддержка заголовка 'If-Modified-Since'
.
SimpleHTTPRequestHandler
.Класс 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
По умолчанию сервер привязывается ко всем интерфейсам. Параметр -b
/--bind
указывает конкретный адрес, к которому он должен привязаться. Поддерживаются адреса IPv4 и IPv6. Например, следующая команда заставляет сервер привязываться только к localhost
:
python -m http.server 8000 --bind 127.0.0.1
Новое в Python 3.8: аргумент --bind
расширен для поддержки IPv6.
По умолчанию сервер использует текущий каталог. Параметр -d
/--directory
указывает каталог, в котором должны обслуживаться файлы. Например, следующая команда использует определенный каталог:
python -m http.server --directory /tmp/
Новое в Python 3.7: параметр --directory
позволяет указать альтернативный каталог.