wsgiref — WSGI Утилиты и Реализация Справочника
Новая в версии 2.5.
Интерфейс шлюза веб-сервера (WSGI) — это стандартный интерфейс между программным обеспечением веб-сервера и веб-приложениями, написанными на Python. Наличие стандартного интерфейса упрощает использование приложения, поддерживающего WSGI, с различными веб-серверами.
Только авторы веб-серверов и программных фреймворков нуждаются в знании всех деталей и крайних случаев проектирования WSGI. Вам не нужно понимать все детали WSGI только для установки приложения WSGI или для написания веб-приложения, используя существующий фреймворк.
wsgiref — это реализация справочника спецификации WSGI, которая может быть использована для добавления поддержки WSGI к веб-серверу или фреймворку. Она предоставляет утилиты для управления переменными среды WSGI и заголовками ответов, базовые классы для реализации WSGI-серверов, демонстрационный HTTP-сервер, который обслуживает WSGI-приложения, и инструмент валидации, который проверяет WSGI-серверы и приложения на соответствие спецификации WSGI (PEP 333).
Дополнительную информацию о WSGI, а также ссылки на учебники и другие ресурсы можно найти на сайте https://wsgi.readthedocs.org/.
1. wsgiref.util – Утилиты окружения WSGI
Этот модуль предоставляет различные утилитарные функции для работы со средами WSGI. Среда WSGI — это словарь, содержащий переменные HTTP-запроса, как описано в PEP 333. Все функции, принимающие параметр environ, ожидают, что будет предоставлен словарь, соответствующий WSGI; подробную спецификацию см. в PEP 333.
-
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=1) -
Возвращает полный URI запроса, необязательно включая строку запроса, используя алгоритм, описанный в разделе «Восстановление URL» в PEP 333. Если 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 333 переменные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')] start_response(status, headers) ret = ["%s: %s\n" % (key, value) for key, value in environ.iteritems()] return ret httpd = make_server('', 8000, simple_app) print "Serving on port 8000..." httpd.serve_forever()
В дополнение к приведенным выше функциям для работы со средой, модуль wsgiref.util также предоставляет следующие вспомогательные функции:
-
wsgiref.util.is_hop_by_hop(header_name) -
Возвращает true, если «header_name» — это HTTP/1.1 заголовок «Hop-by-Hop», как определено в RFC 2616.
-
class wsgiref.util.FileWrapper(filelike, blksize=8192) -
Обёртка для преобразования объекта типа «файл» в итератор. Результирующие объекты поддерживают как
__getitem__(), так и__iter__()стили итерации для совместимости с Python 2.1 и Jython. По мере перебора объекта необязательный параметр blksize будет многократно передаваться методуread()объекта filelike для получения строк, которые будут возвращаться. Когдаread()возвращает пустую строку, итерация завершается и не может быть возобновлена.Если у filelike есть метод
close(), у возвращаемого объекта также будет методclose(), и он будет вызывать методclose()объекта filelike при вызове.Пример использования:
from StringIO 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
2. wsgiref.headers – Инструменты WSGI заголовков ответов
Этот модуль предоставляет единственный класс, Headers, для удобной обработки заголовков WSGI-ответов с помощью интерфейса, подобного отображению.
-
class wsgiref.headers.Headers(headers) -
Создайте объект, похожий на словарь, оборачивающий заголовки, которые должны быть списком кортежей имени/значения заголовка, как описано в PEP 333. Любые изменения, внесенные в новый объект
Headers, будут непосредственно обновлять список заголовков, с которым он был создан.Объекты
Headersподдерживают типичные операции с отображением, включая__getitem__(),get(),__setitem__(),setdefault(),__delitem__(),__contains__()иhas_key(). Для каждого из этих методов ключ — это имя заголовка (обращается без учета регистра), а значение — первое значение, связанное с этим именем заголовка. Установка заголовка удаляет все существующие значения для этого заголовка, а затем добавляет новое значение в конец обернутого списка заголовков. Общий порядок существующих заголовков сохраняется, а новые заголовки добавляются в конец обернутого списка.В отличие от словаря, объекты
Headersне генерируют ошибку, когда вы пытаетесь получить или удалить ключ, который отсутствует в обернутом списке заголовков. Получение несуществующего заголовка просто возвращаетNone, а удаление несуществующего заголовка ничего не делает.Объекты
Headersтакже поддерживаютkeys(),values(), иitems()методы. В списках, возвращаемыхkeys()иitems(), ключ может встречаться более одного раза, если заголовок имеет несколько значений. Количество элементов в объектеHeadersсовпадает с длиной егоitems(), которая, в свою очередь, совпадает с длиной обернутого списка заголовков. Фактически, методitems()просто возвращает копию обернутого списка заголовков.Вызов
str()для объекта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. wsgiref.simple_server – простой сервер WSGI HTTP
Этот модуль реализует простой HTTP-сервер (на основе BaseHTTPServer), который обслуживает 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 333.
Пример использования:
from wsgiref.simple_server import make_server, demo_app httpd = make_server('', 8000, demo_app) 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 должен быть подклассомBaseHTTPServer.BaseHTTPRequestHandler, который будет использоваться для обработки запросов.Вам обычно не нужно вызывать этот конструктор, так как функция
make_server()может обработать все детали за вас.Класс
WSGIServerявляется подклассомBaseHTTPServer.HTTPServer, поэтому все его методы (такие какserve_forever()иhandle_request()) доступны. КлассWSGIServerтакже предоставляет эти методы, специфичные для WSGI:-
set_app(application) -
Устанавливает вызываемый объект application в качестве WSGI-приложения, которое будет получать запросы.
-
get_app() -
Возвращает текущую вызываемую функцию приложения.
Однако обычно вам не нужно использовать эти дополнительные методы, так как
set_app()обычно вызывается функциейmake_server(), аget_app()в основном существует для удобства экземпляров обработчиков запросов. -
-
class wsgiref.simple_server.WSGIRequestHandler(request, client_address, server) -
Создать обработчик HTTP для заданного запроса (т. е. сокета), адреса_клиента (кортежа
(host,port)) и сервера (WSGIServerэкземпляр).Вам не нужно создавать экземпляры этого класса напрямую; они автоматически создаются по мере необходимости объектами
WSGIServer. Однако вы можете создать подкласс этого класса и предоставить его как handler_class функцииmake_server(). Некоторые, возможно, полезные методы для переопределения в подклассах:-
get_environ() -
Возвращает словарь, содержащий среду WSGI для запроса. Базовая реализация копирует содержимое словаря
base_environобъектаWSGIServerи затем добавляет различные заголовки, полученные из HTTP-запроса. Каждый вызов этого метода должен возвращать новый словарь, содержащий все соответствующие переменные окружения CGI, как указано в PEP 333.
-
get_stderr() -
Возвращает объект, который должен использоваться в качестве потока
wsgi.errors. Базовая реализация просто возвращаетsys.stderr.
-
handle() -
Обрабатывает HTTP-запрос. Базовая реализация создаёт экземпляр обработчика, используя класс
wsgiref.handlersдля реализации фактического интерфейса WSGI-приложения.
-
4. wsgiref.validate — Проверка соответствия WSGI
При создании новых объектов WSGI-приложений, фреймворков, серверов или middleware может быть полезно проверить соответствие нового кода с помощью wsgiref.validate. Этот модуль предоставляет функцию, которая создаёт объекты WSGI-приложений, которые проверяют взаимодействие между WSGI-сервером или шлюзом и объектом WSGI-приложения, чтобы проверить обе стороны на соответствие протоколу.
Обратите внимание, что эта утилита не гарантирует полное соответствие PEP 333; отсутствие ошибок в этом модуле не обязательно означает, что ошибок нет. Однако, если этот модуль выдаёт ошибку, то практически наверняка либо сервер, либо приложение не полностью соответствует стандарту.
Этот модуль основан на модуле 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 333. Если такие предупреждения не подавлены с помощью командной строки 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 "Hello World" # This is the application wrapped in a validator validator_app = validator(simple_app) httpd = make_server('', 8000, validator_app) print "Listening on port 8000...." httpd.serve_forever()
5. 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.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.
-
class wsgiref.handlers.BaseHandler
-
Это абстрактный базовый класс для запуска WSGI-приложений. Каждый экземпляр будет обрабатывать один HTTP-запрос, хотя в принципе вы можете создать подкласс, который можно повторно использовать для обработки нескольких запросов.
BaseHandlerэкземпляры имеют только один метод, предназначенный для внешнего использования:-
run(app) -
Запустить указанное WSGI-приложение, app.
Все остальные методы
BaseHandlerвызываются этим методом в процессе запуска приложения и, следовательно, существуют в основном для настройки этого процесса.Следующие методы ОБЯЗАТЕЛЬНО должны быть переопределены в подклассе:
-
_write(data) -
Буферизовать строку data для передачи клиенту. Это допустимо, если этот метод фактически передает данные;
BaseHandlerпросто разделяет операции записи и сброса буфера для повышения эффективности, когда в базовой системе есть такое различие.
-
_flush() -
Принудительно передать буферизованные данные клиенту. Это допустимо, если этот метод является пустым (т.е., если
_write()фактически отправляет данные).
-
get_stdin() -
Возвращает объект потока ввода, пригодный для использования в качестве
wsgi.inputтекущего обрабатываемого запроса.
-
get_stderr() -
Возвращает объект потока вывода, пригодный для использования в качестве
wsgi.errorsтекущего обрабатываемого запроса.
-
add_cgi_vars() -
Вставляет переменные CGI для текущего запроса в атрибут
environ.
Вот некоторые другие методы и атрибуты, которые вы, возможно, захотите переопределить. Однако этот список является лишь кратким обзором и не включает все переопределяемые методы. Перед попыткой создания настраиваемого подкласса
BaseHandlerвы должны обратиться к строкам документации и исходному коду для получения дополнительной информации.Атрибуты и методы для настройки среды WSGI:
-
wsgi_multithread -
Значение, используемое для переменной среды
wsgi.multithread. По умолчанию вBaseHandlerоно равно true, но в других подклассах может быть другим по умолчанию (или установлено конструктором).
-
wsgi_multiprocess -
Значение, используемое для переменной среды
wsgi.multiprocess. По умолчанию вBaseHandlerоно равно true, но в других подклассах может быть другим по умолчанию (или установлено конструктором).
-
wsgi_run_once -
Значение, используемое для переменной среды
wsgi.run_once. По умолчанию вBaseHandlerоно равно false, ноCGIHandlerустанавливает его по умолчанию в true.
-
os_environ -
Переменные среды по умолчанию, которые будут включены в среду WSGI каждого запроса. По умолчанию это копия
os.environна момент импортаwsgiref.handlers, но подклассы могут создать свои собственные на уровне класса или экземпляра. Обратите внимание, что словарь следует рассматривать как неизменяемый, так как значение по умолчанию используется несколькими классами и экземплярами.
-
server_software -
Если атрибут
origin_serverустановлен, значение этого атрибута используется для установки значения переменной среды WSGI по умолчаниюSERVER_SOFTWARE, а также для установки заголовка по умолчаниюServer:в HTTP-ответах. Он игнорируется для обработчиков (таких какBaseCGIHandlerиCGIHandler), которые не являются исходными серверами HTTP.
-
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 333).Стандартная реализация просто использует атрибуты
error_status,error_headersиerror_bodyдля генерации страницы вывода. Подклассы могут переопределить этот метод для создания более динамичного вывода ошибок.Однако с точки зрения безопасности не рекомендуется отображать диагностическую информацию любому пользователю; желательно, чтобы для отображения диагностической информации требовалось специальное действие, поэтому стандартная реализация не включает её.
-
error_status -
HTTP-статус, используемый для ответов с ошибками. Он должен быть строкой статуса, как определено в PEP 333; по умолчанию используется код 500 и сообщение.
-
error_headers -
HTTP-заголовки, используемые для ответов с ошибками. Это должен быть список WSGI-заголовков ответа (кортежей
(name, value)), как описано в PEP 333. По умолчанию в списке устанавливается тип контентаtext/plain.
-
error_body -
Тело ответа с ошибкой. Это должна быть строка HTTP-тела ответа. По умолчанию — текстовое значение «Произошла ошибка сервера. Пожалуйста, обратитесь к администратору».
Методы и атрибуты для функции «Необязательная обработка файлов, специфичных для платформы», описанной в PEP 333:
-
-
wsgi_file_wrapper -
Заводская функция, или
None. Значение по умолчанию для этого атрибута — классFileWrapperизwsgiref.util.
-
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".
-
6. Примеры
Вот рабочий пример WSGI-приложения «Hello World»:
from wsgiref.simple_server import make_server
# Every WSGI application must have an application object - a callable
# object that accepts two arguments. For that purpose, we're going to
# use a function (note that you're not limited to a function, you can
# use a class for example). The first argument passed to the function
# is a dictionary containing CGI-style environment variables and the
# second variable is the callable object (see PEP 333).
def hello_world_app(environ, start_response):
status = '200 OK' # HTTP Status
headers = [('Content-type', 'text/plain')] # HTTP Headers
start_response(status, headers)
# The returned object is going to be printed
return ["Hello World"]
httpd = make_server('', 8000, hello_world_app)
print "Serving on port 8000..."
# Serve until process is killed
httpd.serve_forever()
© 2001–2020 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/2.7/library/wsgiref.html