Spec-Zone.ru › Python 3.13

wsgiref — утилиты WSGI и эталонная реализация

Исходный код: Lib/wsgiref

Интерфейс шлюза веб-сервера (WSGI) — это стандартный интерфейс между программным обеспечением веб-сервера и веб-приложениями, написанными на Python. Стандартный интерфейс упрощает использование приложения с поддержкой WSGI на различных веб-серверах.

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

wsgiref — эталонная реализация спецификации WSGI, которую можно использовать для добавления поддержки WSGI в веб-сервер или фреймворк. Она предоставляет утилиты для обработки переменных среды WSGI и заголовков ответа, базовые классы для реализации серверов WSGI, демонстрационный HTTP-сервер для обслуживания приложений WSGI, типы для статической проверки типов и средство проверки соответствия серверов и приложений WSGI спецификации WSGI (PEP 3333).

Дополнительные сведения о WSGI, а также ссылки на руководства и другие ресурсы см. на сайте wsgi.readthedocs.io.

wsgiref.util – утилиты для среды WSGI

Этот модуль предоставляет различные служебные функции для работы со средами WSGI. Среда WSGI — это словарь, содержащий переменные HTTP-запроса, описанные в PEP 3333. Все функции, принимающие параметр environ, ожидают, что им будет передан соответствующий WSGI словарь; подробную спецификацию см. в PEP 3333, а псевдоним типа, который можно использовать в аннотациях типов, — в WSGIEnvironment.

wsgiref.util.guess_scheme(environ)

Предположительно определяет, должна ли wsgi.url_scheme быть «http» или «https», проверяя наличие переменной среды HTTPS в словаре environ. Возвращаемое значение — строка.

Эта функция полезна при создании шлюза, оборачивающего CGI или подобный CGI протокол, например FastCGI. Обычно серверы, предоставляющие такие протоколы, добавляют переменную HTTPS со значением «1», «yes» или «on», если запрос получен через SSL. Поэтому эта функция возвращает «https», если найдено такое значение, и в противном случае — «http».

wsgiref.util.request_uri(environ, include_query=True)

Возвращает полный URI запроса, при необходимости включая строку запроса, используя алгоритм из раздела «Восстановление URL» в PEP 3333. Если include_query равно false, строка запроса не включается в результирующий URI.

wsgiref.util.application_uri(environ)

Похожа на request_uri(), но переменные PATH_INFO и QUERY_STRING игнорируются. Результат — базовый URI объекта приложения, к которому обращается запрос.

wsgiref.util.shift_path_info(environ)

Перемещает одно имя из PATH_INFO в SCRIPT_NAME и возвращает это имя. Словарь environ изменяется на месте; используйте копию, если нужно сохранить исходные значения PATH_INFO или SCRIPT_NAME.

Если в PATH_INFO не осталось сегментов пути, возвращается None.

Обычно эта функция используется для обработки каждой части пути URI запроса, например, чтобы интерпретировать путь как последовательность ключей словаря. Функция изменяет переданную среду, подготавливая её для вызова другого WSGI-приложения, расположенного по целевому URI. Например, если WSGI-приложение находится по адресу /foo, путь URI запроса равен /foo/bar/baz, а WSGI-приложение по адресу /foo вызывает shift_path_info(), оно получит строку «bar», а среда будет обновлена так, чтобы её можно было передать WSGI-приложению по адресу /foo/bar. То есть SCRIPT_NAME изменится с /foo на /foo/bar, а PATH_INFO изменится с /bar/baz на /baz.

Если PATH_INFO равно просто «/», эта функция возвращает пустую строку и добавляет завершающий слеш к SCRIPT_NAME, хотя пустые сегменты пути обычно игнорируются, а SCRIPT_NAME обычно не заканчивается слешем. Такое поведение предусмотрено намеренно: оно позволяет приложению при обходе объектов различать URI, заканчивающиеся на /x, и URI, заканчивающиеся на /x/.

wsgiref.util.setup_testing_defaults(environ)

Заполняет environ простыми значениями по умолчанию для тестирования.

Эта функция добавляет различные параметры, необходимые для WSGI, включая HTTP_HOST, SERVER_NAME, SERVER_PORT, REQUEST_METHOD, SCRIPT_NAME, PATH_INFO и все переменные wsgi.*, определённые в PEP 3333. Она предоставляет только значения по умолчанию и не заменяет существующие значения этих переменных.

Эта функция предназначена для упрощения настройки фиктивных сред в модульных тестах серверов и приложений WSGI. Её НЕ СЛЕДУЕТ использовать в реальных серверах или приложениях WSGI, поскольку данные являются фиктивными!

Пример использования (см. также demo_app() для другого примера):

from wsgiref.util import setup_testing_defaults
from wsgiref.simple_server import make_server

# A relatively simple WSGI application. It's going to print out the
# environment dictionary after being updated by setup_testing_defaults
def simple_app(environ, start_response):
    setup_testing_defaults(environ)

    status = '200 OK'
    headers = [('Content-type', 'text/plain; charset=utf-8')]

    start_response(status, headers)

    ret = [("%s: %s\n" % (key, value)).encode("utf-8")
           for key, value in environ.items()]
    return ret

with make_server('', 8000, simple_app) as httpd:
    print("Serving on port 8000...")
    httpd.serve_forever()

Помимо описанных выше функций для работы со средой, модуль wsgiref.util предоставляет также следующие вспомогательные утилиты:

wsgiref.util.is_hop_by_hop(header_name)

Возвращает True, если ‘header_name’ является заголовком HTTP/1.1 типа “Hop-by-Hop”, определённым в RFC 2616.

class wsgiref.util.FileWrapper(filelike, blksize=8192)

Конкретная реализация протокола wsgiref.types.FileWrapper, используемого для преобразования файлового объекта в итератор. Полученные объекты являются итерируемыми. При переборе объекта необязательный параметр blksize будет многократно передаваться методу read() объекта filelike для получения и выдачи байтовых строк. Когда read() возвращает пустую байтовую строку, итерация завершается и не может быть возобновлена.

Если у filelike есть метод close(), у возвращённого объекта также будет метод close(), который при вызове вызовет метод close() объекта filelike.

Пример использования:

from io import StringIO
from wsgiref.util import FileWrapper

# We're using a StringIO-buffer for as the file-like object
filelike = StringIO("This is an example file-like object"*10)
wrapper = FileWrapper(filelike, blksize=5)

for chunk in wrapper:
    print(chunk)

Изменено в версии 3.11: Поддержка метода __getitem__() удалена.

wsgiref.headers – инструменты для заголовков ответа WSGI

Этот модуль предоставляет один класс — Headers, — для удобной обработки заголовков ответа WSGI с помощью интерфейса, подобного отображению.

class wsgiref.headers.Headers([headers])

Создаёт объект с интерфейсом, подобным отображению, оборачивающий headers. Это должен быть список кортежей «имя заголовка/значение», как описано в PEP 3333. По умолчанию headers — пустой список.

Объекты Headers поддерживают типичные операции отображений, включая __getitem__(), get(), __setitem__(), setdefault(), __delitem__() и __contains__(). Для каждого из этих методов ключом является имя заголовка (без учёта регистра), а значением — первое значение, связанное с этим именем. При установке заголовка все существующие значения этого заголовка удаляются, после чего новое значение добавляется в конец обёрнутого списка заголовков. Порядок существующих заголовков в целом сохраняется, а новые добавляются в конец обёрнутого списка.

В отличие от словаря, объекты Headers не вызывают ошибку при попытке получить или удалить ключ, которого нет в обёрнутом списке заголовков. При получении несуществующего заголовка возвращается None, а удаление несуществующего заголовка ничего не делает.

Объекты Headers также поддерживают методы keys(), values() и items(). Списки, возвращаемые методами keys() и items(), могут содержать один и тот же ключ несколько раз, если заголовок имеет несколько значений. len() объекта Headers совпадает с длиной его items(), которая, в свою очередь, совпадает с длиной обёрнутого списка заголовков. На самом деле метод items() просто возвращает копию обёрнутого списка заголовков.

Вызов bytes() для объекта Headers возвращает отформатированную байтовую строку, пригодную для передачи в качестве заголовков HTTP-ответа. Каждый заголовок помещается в отдельную строку вместе со значением, отделённым двоеточием и пробелом. Каждая строка завершается возвратом каретки и переводом строки, а байтовая строка завершается пустой строкой.

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

get_all(name)

Возвращает список всех значений указанного заголовка.

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

add_header(name, value, **_params)

Добавляет заголовок (возможно, с несколькими значениями) с необязательными параметрами MIME, заданными с помощью именованных аргументов.

name — добавляемое поле заголовка. Именованные аргументы можно использовать для задания параметров MIME поля заголовка. Каждый параметр должен быть строкой или None. Символы подчёркивания в именах параметров заменяются дефисами, поскольку дефисы недопустимы в идентификаторах Python, но многие имена параметров MIME содержат дефисы. Если значение параметра является строкой, оно добавляется к параметрам значения заголовка в формате name="value". Если это None, добавляется только имя параметра. (Это используется для параметров MIME без значения.) Пример использования:

h.add_header('content-disposition', 'attachment', filename='bud.gif')

В результате будет добавлен заголовок следующего вида:

Content-Disposition: attachment; filename="bud.gif"

Изменено в версии 3.5: Параметр headers стал необязательным.

wsgiref.simple_server – простой HTTP-сервер WSGI

Этот модуль реализует простой HTTP-сервер (на основе http.server), который обслуживает приложения WSGI. Каждый экземпляр сервера обслуживает одно приложение WSGI на заданном хосте и порту. Если нужно обслуживать несколько приложений на одном хосте и порту, следует создать приложение WSGI, которое анализирует PATH_INFO, чтобы выбирать вызываемое приложение для каждого запроса. (Например, используя функцию shift_path_info() из wsgiref.util.)

wsgiref.simple_server.make_server(host, port, app, server_class=WSGIServer, handler_class=WSGIRequestHandler)

Создаёт новый сервер WSGI, прослушивающий host и port и принимающий соединения для app. Возвращаемое значение — экземпляр указанного server_class, который будет обрабатывать запросы с помощью заданного handler_class. app должен быть объектом приложения WSGI, определённым в PEP 3333.

Пример использования:

from wsgiref.simple_server import make_server, demo_app

with make_server('', 8000, demo_app) as httpd:
    print("Serving HTTP on port 8000...")

    # Respond to requests until process is killed
    httpd.serve_forever()

    # Alternative: serve one request, then exit
    httpd.handle_request()
wsgiref.simple_server.demo_app(environ, start_response)

Эта функция представляет собой небольшое, но полноценное приложение WSGI, которое возвращает текстовую страницу с сообщением «Привет, мир!» и списком пар ключ/значение, переданных в параметре environ. Она полезна для проверки того, что сервер WSGI (например, wsgiref.simple_server) может правильно запускать простое приложение WSGI.

Вызываемый объект start_response должен соответствовать протоколу StartResponse.

class wsgiref.simple_server.WSGIServer(server_address, RequestHandlerClass)

Создаёт экземпляр WSGIServer. server_address должен быть кортежем (host,port), а RequestHandlerClass — подклассом http.server.BaseHTTPRequestHandler, который будет использоваться для обработки запросов.

Обычно вызывать этот конструктор не требуется, поскольку функция make_server() может выполнить всю необходимую настройку.

WSGIServer является подклассом http.server.HTTPServer, поэтому доступны все его методы (например, serve_forever() и handle_request()). Кроме того, WSGIServer предоставляет следующие специфичные для WSGI методы:

set_app(application)

Устанавливает вызываемый объект application в качестве приложения WSGI, которое будет получать запросы.

get_app()

Возвращает вызываемый объект приложения, установленный в данный момент.

Однако обычно использовать эти дополнительные методы не требуется: set_app() обычно вызывается функцией make_server(), а get_app() существует главным образом для использования экземплярами обработчиков запросов.

class wsgiref.simple_server.WSGIRequestHandler(request, client_address, server)

Создаёт обработчик HTTP для заданных request (то есть сокета), client_address (кортеж (host,port)) и server (экземпляра WSGIServer).

Создавать экземпляры этого класса напрямую не нужно: объекты WSGIServer создают их автоматически по мере необходимости. Однако этот класс можно наследовать и передать как handler_class функции make_server(). Некоторые методы, которые может иметь смысл переопределить в подклассах:

get_environ()

Возвращает словарь WSGIEnvironment для запроса. Реализация по умолчанию копирует содержимое атрибута-словаря base_environ объекта WSGIServer, а затем добавляет различные заголовки, полученные из HTTP-запроса. Каждый вызов этого метода должен возвращать новый словарь, содержащий все соответствующие переменные среды CGI, указанные в PEP 3333.

get_stderr()

Возвращает объект, который следует использовать в качестве потока wsgi.errors. Реализация по умолчанию просто возвращает sys.stderr.

handle()

Обрабатывает HTTP-запрос. Реализация по умолчанию создаёт экземпляр обработчика, использующий класс wsgiref.handlers для реализации собственно интерфейса приложения WSGI.

wsgiref.validate — средство проверки соответствия WSGI

При создании новых объектов приложений WSGI, фреймворков, серверов или промежуточного ПО бывает полезно проверить соответствие нового кода спецификации с помощью wsgiref.validate. Этот модуль предоставляет функцию, создающую объекты приложений WSGI, которые проверяют взаимодействие между сервером или шлюзом WSGI и объектом приложения WSGI на соответствие протоколу с обеих сторон.

Обратите внимание: эта утилита не гарантирует полного соответствия PEP 3333; отсутствие ошибок, выявленных этим модулем, не обязательно означает отсутствие ошибок. Однако если модуль обнаружит ошибку, то почти наверняка сервер или приложение не полностью соответствует спецификации.

Этот модуль основан на модуле paste.lint из библиотеки “Python Paste” Иэна Бикинга.

wsgiref.validate.validator(application)

Оборачивает application и возвращает новый объект приложения WSGI. Возвращённое приложение перенаправляет все запросы исходному application и проверяет, соответствует ли спецификации WSGI и RFC 2616 как само application, так и вызывающий его сервер.

При обнаружении любого несоответствия вызывается исключение AssertionError; однако способ обработки этих ошибок зависит от сервера. Например, wsgiref.simple_server и другие серверы на основе wsgiref.handlers (которые не переопределяют методы обработки ошибок для выполнения других действий) просто выведут сообщение об ошибке и трассировку стека в sys.stderr или другой поток ошибок.

Эта обёртка также может выводить сообщения с помощью модуля warnings, указывающие на сомнительное поведение, которое при этом может не быть прямо запрещено PEP 3333. Если такие предупреждения не подавлены параметрами командной строки Python или API модуля warnings, они будут записаны в sys.stderr (не в wsgi.errors, если только это не один и тот же объект).

Пример использования:

from wsgiref.validate import validator
from wsgiref.simple_server import make_server

# Our callable object which is intentionally not compliant to the
# standard, so the validator is going to break
def simple_app(environ, start_response):
    status = '200 OK'  # HTTP Status
    headers = [('Content-type', 'text/plain')]  # HTTP Headers
    start_response(status, headers)

    # This is going to break because we need to return a list, and
    # the validator is going to inform us
    return b"Hello World"

# This is the application wrapped in a validator
validator_app = validator(simple_app)

with make_server('', 8000, validator_app) as httpd:
    print("Listening on port 8000....")
    httpd.serve_forever()

wsgiref.handlers – базовые классы сервера/шлюза

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

class wsgiref.handlers.CGIHandler

Вызов на основе CGI через sys.stdin, sys.stdout, sys.stderr и os.environ. Это полезно, когда у вас есть приложение WSGI и вы хотите запустить его как скрипт CGI. Просто вызовите CGIHandler().run(app), где app — объект приложения WSGI, который вы хотите вызвать.

Этот класс является подклассом BaseCGIHandler, который устанавливает wsgi.run_once в значение true, wsgi.multithread в значение false, а wsgi.multiprocess в значение true, и всегда использует sys и os для получения необходимых потоков и окружения CGI.

class wsgiref.handlers.IISCGIHandler

Специализированная альтернатива CGIHandler, предназначенная для развертывания на веб-сервере Microsoft IIS без включения параметра конфигурации allowPathInfo (IIS>=7) или metabase allowPathInfoForScriptMappings (IIS<7).

По умолчанию IIS передает PATH_INFO, в начале которого дублируется SCRIPT_NAME, что создает проблемы для приложений WSGI, которым нужна маршрутизация. Этот обработчик удаляет такие дублирующиеся пути.

IIS можно настроить на передачу корректного PATH_INFO, но это приводит к другой ошибке: PATH_TRANSLATED оказывается неверным. К счастью, эта переменная используется редко и ее наличие не гарантируется WSGI. Однако в IIS<7 этот параметр можно задать только на уровне виртуального хоста, что влияет на все остальные сопоставления сценариев, многие из которых перестают работать при возникновении ошибки PATH_TRANSLATED. По этой причине IIS<7 почти никогда не развертывают с этим исправлением (IIS7 тоже редко его использует, поскольку для него до сих пор нет пользовательского интерфейса.).

Код CGI не может определить, включен ли этот параметр, поэтому предоставляется отдельный класс обработчика. Он используется так же, как CGIHandler, то есть путем вызова IISCGIHandler().run(app), где app — объект приложения WSGI, который вы хотите вызвать.

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

class wsgiref.handlers.BaseCGIHandler(stdin, stdout, stderr, environ, multithread=True, multiprocess=False)

Похож на CGIHandler, но вместо модулей sys и os окружение CGI и потоки ввода-вывода задаются явно. Значения multithread и multiprocess используются для установки флагов wsgi.multithread и wsgi.multiprocess для всех приложений, запускаемых экземпляром обработчика.

Этот класс является подклассом SimpleHandler и предназначен для использования с программным обеспечением, отличным от HTTP-серверов-источников. Если вы пишете реализацию протокола шлюза (например, CGI, FastCGI, SCGI и т. д.), которая использует заголовок Status: для передачи состояния HTTP, вероятно, вам следует создать подкласс этого класса, а не SimpleHandler.

class wsgiref.handlers.SimpleHandler(stdin, stdout, stderr, environ, multithread=True, multiprocess=False)

Похож на BaseCGIHandler, но предназначен для использования с HTTP-серверами-источниками. Если вы пишете реализацию HTTP-сервера, вероятно, вам следует создать подкласс этого класса, а не BaseCGIHandler.

Этот класс является подклассом BaseHandler. Он переопределяет методы __init__(), get_stdin(), get_stderr(), add_cgi_vars(), _write() и _flush(), чтобы поддерживать явную установку окружения и потоков через конструктор. Переданные окружение и потоки сохраняются в атрибутах stdin, stdout, stderr и environ.

Метод write() объекта stdout должен записывать каждый блок целиком, как это делает io.BufferedIOBase.

class wsgiref.handlers.BaseHandler

Это абстрактный базовый класс для запуска приложений WSGI. Каждый экземпляр обрабатывает один HTTP-запрос, хотя в принципе можно создать подкласс, пригодный для повторного использования при обработке нескольких запросов.

У экземпляров BaseHandler есть только один метод, предназначенный для внешнего использования:

run(app)

Запустить указанное приложение WSGI app.

Все остальные методы BaseHandler вызываются этим методом в процессе выполнения приложения и существуют главным образом для настройки этого процесса.

В подклассе НЕОБХОДИМО переопределить следующие методы:

_write(data)

Буферизовать байты data для передачи клиенту. Этот метод может фактически передавать данные; BaseHandler лишь разделяет операции записи и сброса буфера для повышения эффективности в системах, где такое разделение действительно существует.

_flush()

Принудительно передать клиенту буферизованные данные. Этот метод может ничего не делать (то есть если _write() фактически отправляет данные).

get_stdin()

Вернуть объект, совместимый с InputStream и пригодный для использования в качестве wsgi.input обрабатываемого в данный момент запроса.

get_stderr()

Вернуть объект, совместимый с ErrorStream и пригодный для использования в качестве wsgi.errors обрабатываемого в данный момент запроса.

add_cgi_vars()

Добавить переменные CGI для текущего запроса в атрибут environ.

Ниже перечислены другие методы и атрибуты, которые можно переопределить. Однако это лишь краткий список, в который входят не все методы, допускающие переопределение. Прежде чем создавать пользовательский подкласс BaseHandler, ознакомьтесь со строками документации и исходным кодом, чтобы получить дополнительные сведения.

Атрибуты и методы для настройки окружения WSGI:

wsgi_multithread

Значение для переменной окружения wsgi.multithread. По умолчанию в BaseHandler оно равно true, но в других подклассах значение по умолчанию может отличаться (или задаваться конструктором).

wsgi_multiprocess

Значение для переменной окружения wsgi.multiprocess. По умолчанию в BaseHandler оно равно true, но в других подклассах значение по умолчанию может отличаться (или задаваться конструктором).

wsgi_run_once

Значение для переменной окружения wsgi.run_once. По умолчанию в BaseHandler оно равно false, но CGIHandler по умолчанию устанавливает его в true.

os_environ

Переменные окружения по умолчанию, включаемые в окружение WSGI каждого запроса. По умолчанию это копия os.environ на момент импорта wsgiref.handlers, но подклассы могут создавать собственный словарь на уровне класса или экземпляра. Обратите внимание, что словарь следует считать доступным только для чтения, поскольку значение по умолчанию является общим для нескольких классов и экземпляров.

server_software

Если задан атрибут origin_server, значение этого атрибута используется для установки значения по умолчанию переменной окружения WSGI SERVER_SOFTWARE, а также заголовка Server: в ответах HTTP. Он игнорируется обработчиками (например, BaseCGIHandler и CGIHandler), которые не являются HTTP-серверами-источниками.

Изменено в версии 3.3: Термин «Python» заменен на специфичный для реализации термин, например «CPython», «Jython» и т. д.

get_scheme()

Вернуть схему URL, используемую для текущего запроса. Реализация по умолчанию использует функцию guess_scheme() из wsgiref.util, чтобы определить, должна ли схема быть «http» или «https», на основе переменных environ текущего запроса.

setup_environ()

Установить атрибут environ, содержащий полностью заполненное окружение WSGI. Реализация по умолчанию использует все перечисленные выше методы и атрибуты, а также методы get_stdin(), get_stderr() и add_cgi_vars() и атрибут wsgi_file_wrapper. Кроме того, если ключ SERVER_SOFTWARE отсутствует, он добавляется, когда атрибут origin_server имеет истинное значение, а атрибут server_software задан.

Методы и атрибуты для настройки обработки исключений:

log_exception(exc_info)

Записать кортеж exc_info в журнал сервера. exc_info — это кортеж (type, value, traceback). Реализация по умолчанию просто записывает трассировку стека в поток wsgi.errors текущего запроса и сбрасывает его. Подклассы могут переопределить этот метод, чтобы изменить формат или перенаправить вывод, отправить трассировку стека администратору по электронной почте или выполнить любое другое действие, которое сочтут подходящим.

traceback_limit

Максимальное количество кадров, включаемых в трассировки стека, выводимые методом log_exception() по умолчанию. Если значение равно None, включаются все кадры.

error_output(environ, start_response)

Этот метод является приложением WSGI, которое формирует страницу ошибки для пользователя. Он вызывается только в том случае, если ошибка возникает до отправки заголовков клиенту.

Метод может получить сведения о текущей ошибке с помощью sys.exception() и должен передать эти сведения в start_response при его вызове (как описано в разделе «Обработка ошибок» документа PEP 3333). В частности, вызываемый объект start_response должен соответствовать протоколу StartResponse.

Реализация по умолчанию использует атрибуты error_status, error_headers и error_body для создания страницы вывода. Подклассы могут переопределить этот метод, чтобы формировать более динамичный вывод ошибок.

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

error_status

Статус HTTP, используемый для ответов об ошибках. Это должна быть строка статуса, определенная в PEP 3333; по умолчанию используется код 500 и соответствующее сообщение.

error_headers

Заголовки HTTP, используемые для ответов об ошибках. Это должен быть список заголовков ответа WSGI (кортежей (name, value)), как описано в PEP 3333. В списке по умолчанию задается только тип содержимого text/plain.

error_body

Тело ответа об ошибке. Это должна быть строка байтов тела ответа HTTP. По умолчанию используется простой текст: «Произошла ошибка сервера. Обратитесь к администратору.»

Методы и атрибуты для поддержки функции «Необязательная обработка файлов на уровне платформы» из PEP 3333:

wsgi_file_wrapper

Фабрика wsgi.file_wrapper, совместимая с wsgiref.types.FileWrapper, или None. По умолчанию значением этого атрибута является класс wsgiref.util.FileWrapper.

sendfile()

Переопределите этот метод для реализации передачи файлов с учетом особенностей платформы. Метод вызывается только в том случае, если возвращаемое приложением значение является экземпляром класса, указанного атрибутом wsgi_file_wrapper. Если файл удалось успешно передать, метод должен вернуть истинное значение, чтобы код передачи по умолчанию не выполнялся. Реализация этого метода по умолчанию просто возвращает ложное значение.

Прочие методы и атрибуты:

origin_server

Этому атрибуту следует присвоить истинное значение, если методы обработчика _write() и _flush() используются для непосредственного взаимодействия с клиентом, а не через шлюзовой протокол в стиле CGI, которому требуется статус HTTP в специальном заголовке Status:.

По умолчанию этот атрибут имеет значение true в BaseHandler, но false в BaseCGIHandler и CGIHandler.

http_version

Если origin_server имеет значение true, этот строковый атрибут используется для установки версии HTTP в ответе, отправляемом клиенту. По умолчанию он равен "1.0".

wsgiref.handlers.read_environ()

Преобразовать переменные CGI из os.environ в строки формата «байты в Unicode» из PEP 3333 и вернуть новый словарь. Эта функция используется CGIHandler и IISCGIHandler вместо прямого использования os.environ, которое не обязательно соответствует WSGI на всех платформах и веб-серверах с Python 3. В частности, это относится к системам, где фактическое окружение ОС представлено в Unicode (например, Windows), а также к системам, где окружение является байтовым, но используемая Python системная кодировка для его декодирования отличается от ISO-8859-1 (например, Unix-системы с UTF-8).

Если вы реализуете собственный обработчик на основе CGI, вам, вероятно, следует использовать эту функцию, а не просто напрямую копировать значения из os.environ.

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

wsgiref.types – типы WSGI для статической проверки типов

Этот модуль предоставляет различные типы для статической проверки типов, как описано в PEP 3333.

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

class wsgiref.types.StartResponse

typing.Protocol, описывающий вызываемые объекты start_response() (PEP 3333).

wsgiref.types.WSGIEnvironment

Псевдоним типа, описывающий словарь окружения WSGI.

wsgiref.types.WSGIApplication

Псевдоним типа, описывающий вызываемый объект приложения WSGI.

class wsgiref.types.InputStream

typing.Protocol, описывающий поток ввода WSGI.

class wsgiref.types.ErrorStream

typing.Protocol, описывающий поток ошибок WSGI.

class wsgiref.types.FileWrapper

typing.Protocol, описывающий обертку файла. Конкретную реализацию этого протокола см. в wsgiref.util.FileWrapper.

Примеры

Это работающее приложение WSGI «Привет, мир», в котором вызываемый объект start_response должен соответствовать протоколу StartResponse:

"""
Every WSGI application must have an application object - a callable
object that accepts two arguments. For that purpose, we're going to
use a function (note that you're not limited to a function, you can
use a class for example). The first argument passed to the function
is a dictionary containing CGI-style environment variables and the
second variable is the callable object.
"""
from wsgiref.simple_server import make_server


def hello_world_app(environ, start_response):
    status = "200 OK"  # HTTP Status
    headers = [("Content-type", "text/plain; charset=utf-8")]  # HTTP Headers
    start_response(status, headers)

    # The returned object is going to be printed
    return [b"Hello World"]

with make_server("", 8000, hello_world_app) as httpd:
    print("Serving on port 8000...")

    # Serve until process is killed
    httpd.serve_forever()

Пример приложения WSGI, предоставляющего текущий каталог; необязательные аргументы командной строки — каталог и номер порта (по умолчанию: 8000):

"""
Small wsgiref based web server. Takes a path to serve from and an
optional port number (defaults to 8000), then tries to serve files.
MIME types are guessed from the file names, 404 errors are raised
if the file is not found.
"""
import mimetypes
import os
import sys
from wsgiref import simple_server, util


def app(environ, respond):
    # Get the file name and MIME type
    fn = os.path.join(path, environ["PATH_INFO"][1:])
    if "." not in fn.split(os.path.sep)[-1]:
        fn = os.path.join(fn, "index.html")
    mime_type = mimetypes.guess_file_type(fn)[0]

    # Return 200 OK if file exists, otherwise 404 Not Found
    if os.path.exists(fn):
        respond("200 OK", [("Content-Type", mime_type)])
        return util.FileWrapper(open(fn, "rb"))
    else:
        respond("404 Not Found", [("Content-Type", "text/plain")])
        return [b"not found"]


if __name__ == "__main__":
    # Get the path and port from command-line arguments
    path = sys.argv[1] if len(sys.argv) > 1 else os.getcwd()
    port = int(sys.argv[2]) if len(sys.argv) > 2 else 8000

    # Make and start the server until control-c
    httpd = simple_server.make_server("", port, app)
    print(f"Serving {path} on port {port}, control-C to stop")
    try:
        httpd.serve_forever()
    except KeyboardInterrupt:
        print("Shutting down.")
        httpd.server_close()

© 2001–2025 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.13/library/wsgiref.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API