Документация Python неофициальный перевод
Содержание страницы

20.4. wsgiref – Утилиты WSGI и эталонная реализацияwsgiref – WSGI Utilities and Reference Implementation

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

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

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

См. http://www.wsgi.org для получения дополнительной информации о WSGI, а также ссылки на руководства и другие ресурсы.

20.4.1. wsgiref.util – Утилиты окружения WSGIwsgiref.util – WSGI environment utilities

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

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 Reconstruction» PEP 333. Если 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, от оканчивающихся на /x/ при использовании этой процедуры для обхода объектов.

wsgiref.util.setup_testing_defaults(environ)

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

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

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

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

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

# Относительно простое WSGI-приложение. Оно выведет
# словарь окружения после обновления с помощью setup_testing_defaults
def simple_app(environ, start_response):
    setup_testing_defaults(environ)

    status = b'200 OK'
    headers = [(b'Content-type', b'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

httpd = make_server('', 8000, simple_app)
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)

Обёртка для преобразования файлоподобного объекта в итератор. Результирующие объекты поддерживают как стиль итерации __getitem__(), так и __iter__() для совместимости с Python 2.1 и Jython. При итерации по объекту необязательный параметр blksize будет многократно передаваться методу read() объекта filelike для получения строк, которые возвращаются. Когда read() возвращает пустую строку, итерация завершается и не может быть возобновлена.

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

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

from io import StringIO
from wsgiref.util import FileWrapper

# В качестве файлоподобного объекта используется буфер StringIO
filelike = StringIO("This is an example file-like object"*10)
wrapper = FileWrapper(filelike, blksize=5)

for chunk in wrapper:
    print(chunk)

20.4.2. wsgiref.headers – Инструменты для заголовков ответов WSGIwsgiref.headers – WSGI response header tools

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

class wsgiref.headers.Headers(headers)

Создаёт объект, подобный отображению, оборачивающий headers, который должен быть списком кортежей имя/значение заголовка, как описано в PEP 333.

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

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

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

Вызов str() для объекта 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"

20.4.3. wsgiref.simple_server – Простой WSGI HTTP-серверwsgiref.simple_server – a simple WSGI HTTP server

Этот модуль реализует простой 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 333.

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

from wsgiref.simple_server import make_server, demo_app

httpd = make_server('', 8000, demo_app)
print("Serving HTTP on port 8000...")

# Отвечать на запросы до завершения процесса
httpd.serve_forever()

# Альтернатива: обработать один запрос и завершить работу
httpd.handle_request()
wsgiref.simple_server.demo_app(environ, start_response)
Эта функция представляет собой небольшое, но полноценное WSGI-приложение, возвращающее текстовую страницу с сообщением «Hello world!» и списком пар ключ/значение, переданных в параметре environ. Она полезна для проверки того, что WSGI-сервер (например wsgiref.simple_server) способен корректно запустить простое WSGI-приложение.
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()
Возвращает словарь, содержащий окружение WSGI для запроса. Реализация по умолчанию копирует содержимое атрибута-словаря base_environ объекта WSGIServer, а затем добавляет различные заголовки, полученные из HTTP-запроса. Каждый вызов этого метода должен возвращать новый словарь, содержащий все соответствующие переменные окружения CGI, как указано в PEP 333.
get_stderr()
Возвращает объект, который должен использоваться в качестве потока wsgi.errors. Реализация по умолчанию просто возвращает sys.stderr.
handle()
Обрабатывает HTTP-запрос. Реализация по умолчанию создаёт экземпляр обработчика, используя класс wsgiref.handlers для реализации интерфейса WSGI-приложения.

20.4.4. wsgiref.validate – средство проверки соответствия WSGIwsgiref.validate – WSGI conformance checker

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

Обратите внимание, что эта утилита не гарантирует полного соответствия PEP 333; отсутствие ошибок от этого модуля не обязательно означает, что ошибок нет. Однако если этот модуль выдаёт ошибку, то практически наверняка либо сервер, либо приложение не соответствует требованиям на 100%.

Этот модуль основан на модуле paste.lint из библиотеки Ian Bicking’s «Python Paste».

wsgiref.validate.validator(application)

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

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

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

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

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

# Наш вызываемый объект, который намеренно не соответствует
# стандарту, поэтому валидатор выдаст ошибку
def simple_app(environ, start_response):
    status = b'200 OK' # HTTP-статус
    headers = [(b'Content-type', b'text/plain')] # HTTP-заголовки
    start_response(status, headers)

    # Это приведёт к ошибке, потому что нужно вернуть список, и
    # валидатор сообщит об этом
    return b"Hello World"

# Это приложение, обёрнутое в валидатор
validator_app = validator(simple_app)

httpd = make_server('', 8000, validator_app)
print("Listening on port 8000....")
httpd.serve_forever()

20.4.5. wsgiref.handlers – базовые классы сервера/шлюзаwsgiref.handlers – server/gateway base classes

Этот модуль предоставляет базовые классы обработчиков для реализации 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.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.

class wsgiref.handlers.BaseHandler

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

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

run(app)
Запускает указанное WSGI-приложение app.

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

Следующие методы ОБЯЗАТЕЛЬНО должны быть переопределены в подклассе:

_write(data)
Буферизует байты data для передачи клиенту. Ничего страшного, если этот метод фактически передаёт данные; BaseHandler просто разделяет операции записи и сброса для повышения эффективности, когда базовая система действительно имеет такое различие.
_flush()
Принудительно отправляет буферизованные данные клиенту. Ничего страшного, если этот метод ничего не делает (то есть если _write() фактически отправляет данные).
get_stdin()
Возвращает объект входного потока, пригодный для использования в качестве wsgi.input текущего обрабатываемого запроса.
get_stderr()
Возвращает объект выходного потока, пригодный для использования в качестве wsgi.errors текущего обрабатываемого запроса.
add_cgi_vars()
Вставляет CGI-переменные для текущего запроса в атрибут environ.

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

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

wsgi_multithread
Значение, используемое для переменной окружения wsgi.multithread. По умолчанию оно равно true в BaseHandler, но может иметь другое значение по умолчанию (или устанавливаться конструктором) в других подклассах.
wsgi_multiprocess
Значение, используемое для переменной окружения wsgi.multiprocess. По умолчанию оно равно true в BaseHandler, но может иметь другое значение по умолчанию (или устанавливаться конструктором) в других подклассах.
wsgi_run_once
Значение, которое будет использоваться для переменной окружения wsgi.run_once. По умолчанию оно равно false в BaseHandler, но CGIHandler по умолчанию устанавливает его в true.
os_environ
Переменные окружения по умолчанию, которые включаются в WSGI-окружение каждого запроса. По умолчанию это копия os.environ на момент импорта wsgiref.handlers, но подклассы могут создать свои собственные на уровне класса или экземпляра. Обратите внимание, что словарь следует считать доступным только для чтения, поскольку значение по умолчанию является общим для нескольких классов и экземпляров.
server_software
Если установлен атрибут origin_server, значение этого атрибута используется для установки переменной окружения WSGI по умолчанию SERVER_SOFTWARE, а также для установки заголовка Server: по умолчанию в HTTP-ответах. Он игнорируется для обработчиков (таких как BaseCGIHandler и CGIHandler), которые не являются исходными HTTP-серверами.
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.exc_info() и должен передавать эту информацию в start_response при её вызове (как описано в разделе «Обработка ошибок» PEP 333).

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

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

error_status
HTTP-статус, используемый для ответов об ошибках. Это должна быть строка статуса, как определено в PEP 333; по умолчанию используется код 500 и соответствующее сообщение.
error_headers
Заголовки HTTP, используемые для ответов об ошибках. Это должен быть список кортежей заголовков WSGI-ответа ((name, value)), как описано в PEP 333. Список по умолчанию просто устанавливает тип содержимого в text/plain.
error_body
Тело ответа об ошибке. Это должна быть строка тела HTTP-ответа. По умолчанию используется обычный текст: «Произошла ошибка сервера. Пожалуйста, свяжитесь с администратором».

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

wsgi_file_wrapper
Фабрика wsgi.file_wrapper или None. Значением этого атрибута по умолчанию является класс wsgiref.util.FileWrapper.
sendfile()
Переопределите для реализации передачи файлов, специфичной для платформы. Этот метод вызывается только в том случае, если возвращаемое значение приложения является экземпляром класса, указанного атрибутом wsgi_file_wrapper. Он должен вернуть истинное значение, если файл удалось успешно передать, чтобы код передачи по умолчанию не выполнялся. Реализация по умолчанию этого метода просто возвращает ложное значение.

Разные методы и атрибуты:

origin_server

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

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

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

20.4.6. ПримерыExamples

Это рабочее WSGI-приложение «Hello World»:

from wsgiref.simple_server import make_server

# Каждое WSGI-приложение должно иметь объект приложения – вызываемый
# объект, который принимает два аргумента. Для этого
# можно использовать функцию (обратите внимание: можно не только функцию, но и, например, класс)
# использовать, например, класс). Первый аргумент, передаваемый функции,
# является словарём, содержащим переменные окружения в стиле CGI и
# вторая переменная – это вызываемый объект (см. PEP 333).
def hello_world_app(environ, start_response):
    status = b'200 OK' # HTTP-статус
    headers = [(b'Content-type', b'text/plain; charset=utf-8')] # HTTP-заголовки
    start_response(status, headers)

    # Возвращаемый объект будет выведен
    return [b"Hello World"]

httpd = make_server('', 8000, hello_world_app)
print("Serving on port 8000...")

# Обслуживать до завершения процесса
httpd.serve_forever()