Spec-Zone.ru › Python 3.5

wsgiref — Утилиты WSGI и реализация по умолчанию

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

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

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

Дополнительную информацию о WSGI, а также ссылки на учебники и другие ресурсы см. на странице https://wsgi.readthedocs.org/.

1. 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-серверами или приложениями, поскольку данные являются фиктивными!

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

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

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(), и он вызовет метод 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)

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

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

class wsgiref.headers.Headers([headers])

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

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

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

Headers объекты также поддерживают keys(), values(), и items() методы. Возвращаемые списки keys() и items() могут содержать один и тот же ключ более одного раза, если заголовок имеет несколько значений. Длина объекта 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 является необязательным.

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

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

httpd = make_server('', 8000, demo_app)
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-приложение, которое возвращает текстовую страницу, содержащую сообщение «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 для заданного запроса (т.е. сокета), client_address (a (host,port) кортеж) и server (WSGIServer экземпляр).

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

get_environ()

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

get_stderr()

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

handle()

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

4. wsgiref.validate — Проверяющий соответствие WSGI

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

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

Этот модуль основан на модуле 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

# 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)

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

5. 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 без установки параметра config 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()

Возвращает объект потока ввода, подходящий для использования в качестве 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 имеет значение true и атрибут 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 — особенно там, где окружение ОС — Unicode (например, Windows), или где окружение — байты, но кодировка системы, используемая Python для декодирования, отличается от ISO-8859-1 (например, Unix-системы с UTF-8).

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

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

6. Примеры

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

from wsgiref.simple_server import make_server

# 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 (see PEP 333).
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"]

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

# Serve until process is killed
httpd.serve_forever()

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

Spec-Zone.ru

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