wsgiref
— Утилиты WSGI и эталонная реализация¶
Исходный код: Lib/wsgiref
Интерфейс шлюза веб-сервера (WSGI) - это стандартный интерфейс между программным обеспечением веб-сервера и веб-приложениями, написанными на Python. Наличие стандартного интерфейса упрощает использование приложения, поддерживающего WSGI, с несколькими различными веб-серверами.
Только авторам веб-серверов и фреймворков программирования необходимо знать каждую деталь дизайна WSGI. Вам не нужно разбираться во всех деталях WSGI, чтобы просто установить приложение WSGI или написать веб-приложение с использованием существующего фреймворка.
wsgiref
- это эталонная реализация спецификации WSGI, которая может быть использована для добавления поддержки WSGI на веб-сервер или платформу. Он предоставляет утилиты для управления переменными среды WSGI и заголовками ответов, базовые классы для реализации серверов WSGI, демонстрационный HTTP-сервер, обслуживающий приложения WSGI, типы для статической проверки типов и инструмент проверки, который проверяет серверы и приложения WSGI на соответствие спецификации WSGI (PEP 3333).
Смотрите wsgi.readthedocs.io для получения дополнительной информации о WSGI, а также ссылок на учебные пособия и другие ресурсы.
wsgiref.util
– Утилиты среды WSGI¶
Этот модуль предоставляет множество полезных функций для работы со средами WSGI. Среда WSGI представляет собой словарь, содержащий переменные HTTP-запроса, как описано в PEP 3333. Все функции, использующие параметр environ, ожидают, что будет предоставлен словарь, совместимый с WSGI; пожалуйста, смотрите PEP 3333 для получения подробной спецификации и WSGIEnvironment
для определения псевдонима типа, который можно использовать в аннотациях к типу.
- wsgiref.util.guess_scheme(environ)¶
Верните предположение о том, должен ли
wsgi.url_scheme
быть «http» или «https», проверив наличие переменной окруженияHTTPS
в словаре environ. Возвращаемое значение является строкой.Эта функция полезна при создании шлюза, который использует CGI или CGI-подобный протокол, такой как FastCGI. Как правило, серверы, предоставляющие такие протоколы, включают переменную
HTTPS
со значением «1», «yes» или «on» при получении запроса по протоколу 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 при настройке фиктивных сред. Она не должна использоваться настоящими серверами или приложениями 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)¶
Конкретная реализация протокола
wsgiref.types.FileWrapper
, используемого для преобразования файлообразного объекта в iterator. Результирующими объектами являются iterables. По мере итерации объекта необязательный параметр 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.11: Поддержка метода
__getitem__()
была удалена.
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, который прослушивает хост и порт, принимая соединения для приложения. Возвращаемое значение является экземпляром предоставленного 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)¶
Устанавливает вызываемое приложение в качестве приложения WSGI, которое будет получать запросы.
- get_app()¶
Возвращает текущее доступное для вызова приложение.
Однако обычно вам не нужно использовать эти дополнительные методы, поскольку
set_app()
обычно вызывается с помощьюmake_server()
, аget_app()
существует в основном для использования в экземплярах обработчика запросов.
- class wsgiref.simple_server.WSGIRequestHandler(request, client_address, server)¶
Создайте HttpHandler для данного запроса (т.е. сокета), client_address (кортеж
(host,port)
) и server (экземплярWSGIServer
).Вам не нужно создавать экземпляры этого класса напрямую; они автоматически создаются по мере необходимости объектами
WSGIServer
. Однако вы можете создать подкласс этого класса и предоставить его как handler_class функцииmake_server()
. Некоторые, возможно, релевантные методы для переопределения в подклассах:- get_environ()¶
Возвращает
WSGIEnvironment
словарь для запроса. Реализация по умолчанию копирует содержимоеWSGIServer
атрибутаbase_environ
словаря объекта, а затем добавляет различные заголовки, полученные из 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. Возвращенное приложение перенаправит все запросы исходному приложению и проверит, что как приложение, так и сервер, вызывающий его, соответствуют спецификации 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 и потоки ввода-вывода указаны явно. Значения многопоточность и многопроцессорность используются для установки флагов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-сервера, вы, вероятно, захотите создать подкласс this вместо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)¶
Буферизуйте байты данных для передачи клиенту. Ничего страшного, если этот метод действительно передает данные;
BaseHandler
просто разделите операции записи и очистки для большей эффективности, если в базовой системе действительно есть такое различие.
- _flush()¶
Принудительно буферизовать данные для передачи клиенту. Ничего страшного, если этот метод не работает (т.е. если
_write()
действительно отправляет данные).
- get_stdin()¶
Возвращает объект, совместимый с
InputStream
, подходящий для использования в качествеwsgi.input
обрабатываемого в данный момент запроса.
- get_stderr()¶
Возвращает объект, совместимый с
ErrorStream
, подходящий для использования в качестве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
. По умолчанию в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.exception()
, и должен передавать эту информацию в 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
, совместимая сwsgiref.types.FileWrapper
илиNone
. Значением этого атрибута по умолчанию является классwsgiref.util.FileWrapper
.
- sendfile()¶
Переопределение для реализации передачи файлов, зависящих от платформы. Этот метод вызывается только в том случае, если возвращаемое приложением значение является экземпляром класса, указанного атрибутом
wsgi_file_wrapper
. Он должен возвращать значение true, если ему удалось успешно передать файл, так что код передачи по умолчанию выполнен не будет. Реализация этого метода по умолчанию просто возвращает значение false.
Различные методы и атрибуты:
- origin_server¶
Этому атрибуту должно быть присвоено значение true, если
_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 строки «байты в юникоде», возвращая новый словарь. Эта функция используетсяCGIHandler
иIISCGIHandler
вместо прямого использованияos.environ
, которое не обязательно совместимо с WSGI на всех платформах и веб-серверах, использующих Python 3, в частности, на тех, где фактическая среда ОС является Unicode (например, Windows) или те, где окружающая среда - это байты, но системная кодировка, используемая Python для ее декодирования, отличается от ISO-8859-1 (например, системы Unix используют UTF-8).Если вы реализуете собственный обработчик на основе CGI, вы, вероятно, захотите использовать эту процедуру вместо простого копирования значений из
os.environ
напрямую.Добавлено в версии 3.2.
wsgiref.types
– Типы WSGI для статической проверки типов¶
Этот модуль предоставляет различные типы для статической проверки типов, как описано в PEP 3333.
Добавлено в версии 3.11.
- class wsgiref.types.StartResponse¶
A
typing.Protocol
, описывающий start_response() вызываемые объекты (PEP 3333).
- wsgiref.types.WSGIEnvironment¶
Псевдоним типа, описывающий словарь среды WSGI.
- wsgiref.types.WSGIApplication¶
Псевдоним типа, описывающий вызываемое приложение WSGI.
- class wsgiref.types.InputStream¶
A
typing.Protocol
, описывающий a WSGI Input Stream.
- class wsgiref.types.ErrorStream¶
A
typing.Protocol
, описывающий a WSGI Error Stream.
- class wsgiref.types.FileWrapper¶
A
typing.Protocol
, описывающий file wrapper. Смотритеwsgiref.util.FileWrapper
для конкретной реализации этого протокола.
Примеры¶
Это работающее приложение WSGI «Hello World»:
"""
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.
"""
from wsgiref.simple_server import make_server
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) в командной строке:
"""
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.
"""
import mimetypes
import os
import sys
from wsgiref import simple_server, util
def app(environ, respond):
# Get the file name and MIME type
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")
mime_type = mimetypes.guess_type(fn)[0]
# Return 200 OK if file exists, otherwise 404 Not Found
if os.path.exists(fn):
respond("200 OK", [("Content-Type", mime_type)])
return util.FileWrapper(open(fn, "rb"))
else:
respond("404 Not Found", [("Content-Type", "text/plain")])
return [b"not found"]
if __name__ == "__main__":
# Get the path and port from command-line arguments
path = sys.argv[1] if len(sys.argv) > 1 else os.getcwd()
port = int(sys.argv[2]) if len(sys.argv) > 2 else 8000
# Make and start the server until control-c
httpd = simple_server.make_server("", port, app)
print(f"Serving {path} on port {port}, control-C to stop")
try:
httpd.serve_forever()
except KeyboardInterrupt:
print("Shutting down.")
httpd.server_close()