wsgiref — Утилиты WSGI и реализация ссылок


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

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

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

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

wsgiref.util — Утилиты среды WSGI

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

wsgiref.util.guess_scheme(environ)

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

Данная функция полезна при создании шлюза, обертывающего CGI или CGI- подобный протокол, такой как FastCGI. Как правило, предоставляющие такие протоколы серверы, включают переменную HTTPS со значением «1», «да» или «включено», когда запрос получен через SSL. Итак, данная функция возвращает «https», если такое значение найдено, и «http» в противном случае.

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

Возвращает полный URI запроса, при необходимости включая строку запроса, используя алгоритм, рассмотренный в разделе «Реконструкция URL-адреса» PEP 3333. Если у include_query ложное значение, строка запроса не включается в результирующий 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 и все переменные PEP 3333, определённые wsgi.*. Он предоставляет только значения по умолчанию и не заменяет какие-либо существующие настройки для данных переменных.

Данная подпрограмма предназначена для упрощения модульных тестов серверов и приложений 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 = '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("Обслуживание через порт 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() и при вызове будет вызывать метод close() объекта filelike.

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

from io import StringIO
from wsgiref.util import FileWrapper

# Мы используем StringIO-буфер в качестве файлового объекта
filelike = StringIO("Это пример файлового объекта"*10)
wrapper = FileWrapper(filelike, blksize=5)

for chunk in wrapper:
    print(chunk)

Не рекомендуется, начиная с версии 3.8: Поддержка протокола последовательности устарела.

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("Обслуживание HTTP на порту 8000...")

    # Отвечать на запросы, пока процесс не будет убит
    httpd.serve_forever()

    # Альтернатива: выполняет один запрос, затем выходит
    httpd.handle_request()
wsgiref.simple_server.demo_app(environ, start_response)

Данная функция представляет собой небольшое, но законченное приложение WSGI, которое возвращает текстовую страницу с сообщением «Привет, мир!» и список пар ключ/значение, указанный в параметре 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 3333.

get_stderr()

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

handle()

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

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

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

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

Данный модуль основан на модуле paste.lint из библиотеки «Python Paste» Яна Бикинга.

wsgiref.validate.validator(application)

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

Любое обнаруженное несоответствие приводит к поднятию 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

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

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

# Это приложение, заключенное в средство проверки
validator_app = validator(simple_app)

with make_server('', 8000, validator_app) as httpd:
    print("Прослушивание порта 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 значение истина, для wsgi.multithread значение ложь и для wsgi.multiprocess значение истина, и всегда использует sys и os для получения необходимых потоков CGI и среды.

class wsgiref.handlers.IISCGIHandler

Специализированная альтернатива CGIHandler для использования при развертывании на веб-сервере Microsoft IIS без установки параметра конфигурации allowPathInfo (IIS>=7) или метабазы 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()

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

get_stderr()

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

add_cgi_vars()

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

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

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

wsgi_multithread

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

wsgi_multiprocess

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

wsgi_run_once

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

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.exc_info(), и должен передать эту информацию start_response при его вызове (как приведено в разделе «Обработка ошибок» PEP 3333).

Реализация по умолчанию просто использует атрибуты 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 или None. Значением этого атрибута по умолчанию является класс wsgiref.util.FileWrapper.

sendfile()

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

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

origin_server

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

Значение этого атрибута по умолчанию — истина в BaseHandler, но ложь в BaseCGIHandler и CGIHandler.

http_version

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

wsgiref.handlers.read_environ()

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

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

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

Примеры

Это работающее Hello World WSGI-приложение:

from wsgiref.simple_server import make_server

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

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

with make_server('', 8000, hello_world_app) as httpd:
    print("Обслуживание через порт 8000...")

    # Работать до тех пор, пока процесс не будет убит
    httpd.serve_forever()

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

#!/usr/bin/env python3
'''
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. Used for the make serve target in Doc.
'''
import sys
import os
import mimetypes
from wsgiref import simple_server, util

def app(environ, respond):

    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')
    type = mimetypes.guess_type(fn)[0]

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

if __name__ == '__main__':
    path = sys.argv[1] if len(sys.argv) > 1 else os.getcwd()
    port = int(sys.argv[2]) if len(sys.argv) > 2 else 8000
    httpd = simple_server.make_server('', port, app)
    print("Serving {} on port {}, control-C to stop".format(path, port))
    try:
        httpd.serve_forever()
    except KeyboardInterrupt:
        print("Shutting down.")
        httpd.server_close()