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 или APIwarnings
, любые такие предупреждения будут записываться в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 настройку можно выполнить только на уровне виртуального хоста, влияя на все другие сопоставления сценариев, многие из которых ломаются при обнаружении ошибки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()