wsgiref
— Утилиты WSGI и реализация ссылок¶
Интерфейс шлюза веб-сервера (WSGI) — это стандартный интерфейс между программным обеспечением веб-сервера и веб-приложениями, написанными на Python. Наличие стандартного интерфейса упрощает использование приложения, поддерживающего WSGI, с несколькими различными веб-серверами.
Только авторы веб-серверов и сред программирования должны знать каждую деталь и краеугольный камень дизайна WSGI. Вам не нужно разбираться во всех деталях WSGI только для того, чтобы установить приложение WSGI или написать веб-приложение с использованием существующей инфраструктуры.
wsgiref
— это эталонная реализация спецификации WSGI, которую можно
использовать для добавления поддержки WSGI на веб-сервер или платформу. Он
предоставляет утилиты для управления переменными среды WSGI и заголовками
ответов, базовые классы для реализации серверов WSGI, демонстрационный HTTP-
сервер, который обслуживает WSGI приложения, и средство проверки, которое
проверяет серверы и WSGI приложения на соответствие спецификации WSGI
(PEP 3333).
См. документацию для получения дополнительной информации о WSGI, а также ссылок на руководства и другие ресурсы.
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 для настройки фиктивных сред. Он НЕ должен использоваться реальными серверами или приложениями 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("Обслуживание через порт 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 # Мы используем StringIO-буфер в качестве файлового объекта filelike = StringIO("Это пример файлового объекта"*10) wrapper = FileWrapper(filelike, blksize=5) for chunk in wrapper: print(chunk)
Не рекомендуется, начиная с версии 3.8: Поддержка
протокола последовательности
устарела.
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("Обслуживание HTTP на порту 8000...") # Отвечать на запросы, пока процесс не будет убит httpd.serve_forever() # Альтернатива: выполняет один запрос, затем выходит httpd.handle_request()
-
wsgiref.simple_server.
demo_app
(environ, start_response)¶ Данная функция представляет собой небольшое, но законченное приложение WSGI, которое возвращает текстовую страницу с сообщением «Привет, мир!» и список пар ключ/значение, указанный в параметре 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
из библиотеки «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 # Наш вызываемый объект, который намеренно не соответствует стандарту, поэтому # средство проверки будет нарушено 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("Прослушивание порта 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
значение истина, дляwsgi.multithread
значение ложь и дляwsgi.multiprocess
значение истина, и всегда используетsys
иos
для получения необходимых потоков CGI и среды.
-
class
wsgiref.handlers.
IISCGIHandler
¶ Специализированная альтернатива
CGIHandler
для использования при развертывании на веб-сервере Microsoft IIS без установки параметра конфигурации allowPathInfo (IIS>=7) или метабазы 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
, но может иметь другое значение по умолчанию (или быть установленным конструктором) в других подклассах.
-
wsgi_multiprocess
¶ Значение, которое будет использоваться для переменной среды
wsgi.multiprocess
. По умолчанию он равен истине вBaseHandler
, но может иметь другое значение по умолчанию (или быть установленным конструктором) в других подклассах.
-
wsgi_run_once
¶ Значение, которое будет использоваться для переменной среды
wsgi.run_once
. По умолчанию ложь вBaseHandler
, ноCGIHandler
по умолчанию устанавливает его в истина.
-
os_environ
¶ Переменные среды по умолчанию, которые должны быть включены в среду WSGI каждого запроса. По умолчанию это копия
os.environ
на момент импортаwsgiref.handlers
, но подклассы могут создавать свои собственные на уровне класса или экземпляра. Обратите внимание, что словарь следует рассматривать как доступный только для чтения, поскольку значение по умолчанию совместно используется несколькими классами и экземплярами.
-
server_software
¶ Если установлен атрибут
origin_server
, значение этого атрибута используется для установки переменной среды WSGISERVER_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
является истинным значением, а атрибут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, в частности, на тех, где фактическая среда ОС является Юникодом (например, Windows), или где среда — это байты, но системная кодировка, используемая Python для её декодирования, отличается от ISO-8859-1 (например, использующие UTF-8 системы Unix).Если вы реализуете собственный обработчик на основе CGI, вы, вероятно, захотите использовать эту процедуру вместо того, чтобы просто копировать значения из
os.environ
напрямую.Добавлено в версии 3.2.
Примеры¶
Это работающее Hello World WSGI-приложение:
from wsgiref.simple_server import make_server
# У каждого WSGI-приложения должен быть объект приложения - вызываемый объект,
# принимающий два аргумента. Для этой цели мы собираемся использовать функцию
# (обратите внимание, что вы не ограничиваетесь функцией, вы можете использовать
# класс, например). Первым аргументом, передаваемым функции, является словарь,
# содержащий переменные среды в стиле CGI, а вторая переменная является вызываемым
# объектом.
def hello_world_app(environ, start_response):
status = '200 OK' # HTTP статус
headers = [('Content-type', 'text/plain; charset=utf-8')] # HTTP заголовки
start_response(status, headers)
# Будет распечатан возвращаемый объект
return [b"Hello World"]
with make_server('', 8000, hello_world_app) as httpd:
print("Обслуживание через порт 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()