wsgiref — Утилиты WSGI и справочная реализация


Интерфейс шлюза веб-сервера (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.

wsgiref.util.guess_scheme(environ)

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

Функция полезна при создании шлюза, который переносит CGI или CGI-подобный протокол, такой как SunCGI. Обычно серверы, предоставляющие такие протоколы, включают HTTPS переменную со значение «1», «да» или «вкл», когда запрос принимается по 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 modified на месте; используйте копию, если необходимо сохранить оригинал 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("Serving on port 8000...")
    httpd.serve_forever()

В дополнение к вышеперечисленным функциям среды модуль wsgiref.util также предоставляет следующие различные утилиты:

wsgiref.util.is_hop_by_hop(header_name)

Возвращает True, если „header_name“ - заголовок «Hop-by-Hop» HTTP/1.1, как определено RFC 2616.

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

Оболочка для преобразования файлового объекта в итератор. Получающиеся объекты поддерживают и __getitem__() и итеративные стили __iter__() для совместимости с Python 2.1 и Jython. По мере итерации объекта необязательный параметр blksize будет повторно передаваться методу read() объекта filelike для получения байт-строк для yield. Когда 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)

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

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...")

    # Отвечать на запросы, пока процесс не будет убит
    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 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 из библиотеки Яна Бикинга (Ian Bicking) «Вставить Python».

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("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, предназначенная для использования при развертывании на веб-сервере IIS Microsoft без установки параметра config allowGroupInfo (IIS > = 7) или метабазы allowStartInfoForStartMappings (IIS < 7).

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

Службы IIS могут быть настроены на передачу правильного PATH_INFO, но это приводит к другой ошибке, когда PATH_TRANSLATED неверно. К счастью, эта переменная редко используемый и не гарантируется WSGI. В IIS < 7, однако, настройка может быть выполнена только на уровне vhost, влияя на все другие сопоставления сценариев, многие из которых ломаются при обращении к 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 и потоки I/O. multithread и multiprocess значения - используемый, чтобы установить wsgi.multithread и флаги wsgi.multiprocess для любых приложений, запущенных обработчик сущность.

Класс представляет собой подкласс SimpleHandler, предназначенных для использования с программным обеспечением, отличным от HTTP «исходных серверов». Если вы пишете реализацию протокола шлюза (например, CGI, SunCGI, 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()

Принудительно передавать буферизованные данные клиенту. Это нормально, если этот метод является no-op (то есть, если _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 атрибут, то значение атрибут используемый для установки переменной среды по умолчанию SERVER_SOFTWARE WSGI, а также для установки заголовка 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:.

Этот значение атрибут по умолчанию имеет значение true в BaseHandler, а false в 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 (например, Unix системы, использующие UTF-8).

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

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

Примеры

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

from wsgiref.simple_server import make_server

# Каждое WSGI-приложение должно иметь объект приложения - вызываемый объект,
# принимающий два аргумента. Для этой цели мы собираемся использовать функцию
# (обратите внимание, что вы не ограничиваетесь функцией, вы можете использовать
# класс, например). Первым аргументом, передаваемым функции, является словарь,
# содержащий переменные среды в стиле CGI, а вторая переменная является вызываемым
# объектом.
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)

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

with make_server('', 8000, hello_world_app) as httpd:
    print("Serving on port 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()