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 протокол, такой как FastCGI. Обычно серверы, предоставляющие такие протоколы, включают переменную
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 изменяется на месте; используйте копию, если вам нужно сохранить исходные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 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если «имя_заголовка» является заголовком 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)
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 для данного запроса (т.е. сокета), адреса клиента (кортежа
(host,port)) и сервера (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-приложений, фреймворков, серверов или middleware может быть полезно проверить соответствие нового кода с помощью 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 или APIwarnings, любые такие предупреждения будут записаны в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установлен, значение этого атрибута используется для установки значения переменной средыSERVER_SOFTWAREWSGI по умолчанию, а также для установки заголовка по умолчанию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имеет значение true, эта строковая переменная используется для установки HTTP-версии ответа, отправляемого клиенту. Значение по умолчанию —"1.0".
-
-
wsgiref.handlers.read_environ() -
Преобразует переменные CGI из
os.environв строки PEP 3333 «bytes in unicode», возвращая новый словарь. Эта функция используетсяCGIHandlerиIISCGIHandlerвместо прямого использованияos.environ, что не обязательно совместимо с WSGI на всех платформах и веб-серверах с Python 3 — особенно на тех, где окружение ОС является Unicode (например, Windows), или где окружение — байты, но кодировка системы, используемая Python для декодирования, отличается от ISO-8859-1 (например, Unix-системы с UTF-8).Если вы реализуете обработчик на основе CGI, вам, вероятно, следует использовать эту функцию вместо непосредственного копирования значений из
os.environ.Новое в версии 3.2.
Примеры
Это работающее приложение 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"]
with make_server('', 8000, hello_world_app) as httpd:
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.7/library/wsgiref.html