Spec-Zone.ru › Python 3.8

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

Интерфейс Web Server Gateway Interface (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, такой как 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 от тех, которые заканчиваются на /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

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

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

wsgiref.util.is_hop_by_hop(header_name)

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

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

Оборачивает объект типа «файл» для преобразования его в итератор. Результирующие объекты поддерживают оба стиля итерации __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)

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

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

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

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

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

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

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

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

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

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

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

class wsgiref.handlers.CGIHandler

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

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

class wsgiref.handlers.IISCGIHandler

Специализированная альтернатива CGIHandler, предназначенная для использования при развертывании на веб-сервере Microsoft IIS, без установки параметра 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. По умолчанию в BaseHandler оно равно true, но в других подклассах оно может иметь другое значение (или быть установленным конструктором).

wsgi_multiprocess

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

wsgi_run_once

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

os_environ

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

server_software

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

Изменено в версии 3.3: Термин «Python» заменён на реализацию конкретного термина, например, «CPython», «Jython» и т. д.

get_scheme()

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

setup_environ()

Устанавливает атрибут environ в полностью заполненную среду WSGI. Реализация по умолчанию использует все вышеперечисленные методы и атрибуты, а также методы get_stdin(), get_stderr() и add_cgi_vars() и атрибут wsgi_file_wrapper. Также вставляет ключ SERVER_SOFTWARE если он отсутствует, при условии, что атрибут origin_server имеет значение 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: заголовке.

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

http_version

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

wsgiref.handlers.read_environ()

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

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

Новое в версии 3.2.

Примеры

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

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.
def hello_world_app(environ, start_response):
    status = '200 OK'  # HTTP Status
    headers = [('Content-type', 'text/plain; charset=utf-8')]  # HTTP Headers
    start_response(status, headers)

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

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

    # Serve until process is killed
    httpd.serve_forever()

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

#!/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()

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

Spec-Zone.ru

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