Содержание страницы
20.4. wsgiref – утилиты WSGI и эталонная реализация¶wsgiref – WSGI Utilities and Reference Implementation
Новое в версии 2.5.
Интерфейс шлюза веб-сервера (WSGI) – это стандартный интерфейс между веб-сервером и веб-приложениями на Python. Наличие стандартного интерфейса упрощает использование приложения, поддерживающего WSGI, с различными веб-серверами.
Только разработчики веб-серверов и фреймворков должны знать все тонкости и пограничные случаи дизайна WSGI. Чтобы установить WSGI-приложение или написать веб-приложение с помощью готового фреймворка, не нужно понимать каждую деталь WSGI.
wsgiref – эталонная реализация спецификации WSGI, которую можно использовать для добавления поддержки WSGI в веб-сервер или фреймворк. Она предоставляет утилиты для работы с переменными окружения WSGI и заголовками ответов, базовые классы для реализации WSGI-серверов, демонстрационный HTTP-сервер, обслуживающий WSGI-приложения, и инструмент проверки, который проверяет соответствие WSGI-серверов и приложений спецификации WSGI (PEP 333).
См. https://wsgi.readthedocs.org/ для получения дополнительной информации о WSGI, а также ссылки на руководства и другие ресурсы.
20.4.1. wsgiref.util – утилиты окружения WSGI¶wsgiref.util – WSGI environment utilities
Этот модуль предоставляет различные вспомогательные функции для работы с окружениями 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», «yes» или «on», когда запрос получен через SSL. Таким образом, эта функция возвращает «https», если такое значение найдено, и «http» в противном случае.
-
wsgiref.util.request_uri(environ, include_query=1)¶ Возвращает полный URI запроса, опционально включая строку запроса, используя алгоритм из раздела «URL Reconstruction» 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и все переменныеwsgi.*, определённые в PEP 333. Она предоставляет только значения по умолчанию и не заменяет существующие настройки этих переменных.Эта процедура предназначена для упрощения настройки фиктивных окружений в модульных тестах серверов и приложений 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')] 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()возвращает пустую строку, итерация завершается и не может быть возобновлена.Если файлоподобный объект имеет метод
close(), возвращаемый объект также будет иметь методclose(), и при вызове он будет вызывать методclose()объекта файлоподобный объект.Пример использования:
from StringIO 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
20.4.2. wsgiref.headers – инструменты для заголовков ответа WSGI¶wsgiref.headers – WSGI response header tools
Этот модуль предоставляет единственный класс Headers для удобной работы с заголовками ответов WSGI через интерфейс, напоминающий словарь (mapping).
-
class
wsgiref.headers.Headers(headers)¶ Создаёт объект, подобный отображению, оборачивающий headers, который должен быть списком кортежей «имя заголовка/значение», как описано в PEP 333. Любые изменения в новом объекте
Headersбудут напрямую обновлять список headers, с которым он был создан.Объекты
Headersподдерживают типичные операции отображения, включая__getitem__(),get(),__setitem__(),setdefault(),__delitem__(),__contains__()иhas_key(). Для каждого из этих методов ключом является имя заголовка (регистронезависимо), а значением – первое значение, связанное с этим именем заголовка. Установка заголовка удаляет все существующие значения для этого заголовка, а затем добавляет новое значение в конец обёрнутого списка заголовков. Существующий порядок заголовков в целом сохраняется, новые заголовки добавляются в конец обёрнутого списка.В отличие от словаря, объекты
Headersне вызывают ошибку при попытке получить или удалить ключ, которого нет в обёрнутом списке заголовков. Получение несуществующего заголовка просто возвращаетNone, а удаление несуществующего заголовка ничего не делает.Объекты
Headersтакже поддерживают методыkeys(),values()иitems(). Списки, возвращаемыеkeys()иitems(), могут содержать один и тот же ключ несколько раз, если заголовок многозначный. Длина (len()) объекта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"
-
20.4.3. wsgiref.simple_server – простой HTTP-сервер WSGI¶wsgiref.simple_server – a simple WSGI HTTP server
Этот модуль реализует простой 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..." # Отвечать на запросы до завершения процесса 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 – подклассом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-обработчик для заданного request (т.е. сокета), client_address (кортеж
(host,port)) и server (экземпляр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-приложения.
-
20.4.4. wsgiref.validate – проверка соответствия WSGI¶wsgiref.validate – WSGI conformance checker
При создании новых объектов WSGI-приложений, фреймворков, серверов или промежуточного ПО может быть полезно проверить соответствие нового кода с помощью wsgiref.validate. Этот модуль предоставляет функцию, которая создаёт объекты WSGI-приложений, проверяющие взаимодействие между WSGI-сервером или шлюзом и объектом WSGI-приложения, чтобы проверить обе стороны на соответствие протоколу.
Обратите внимание, что эта утилита не гарантирует полного соответствия PEP 333; отсутствие ошибок от этого модуля не обязательно означает, что ошибок нет. Однако если этот модуль выдаёт ошибку, то практически наверняка либо сервер, либо приложение не соответствует требованиям на 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 333. Если такие предупреждения не подавлены с помощью параметров командной строки 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 "Hello World" # Это приложение, обёрнутое в валидатор validator_app = validator(simple_app) httpd = make_server('', 8000, validator_app) print "Listening on port 8000...." httpd.serve_forever()
20.4.5. wsgiref.handlers – базовые классы сервера/шлюза¶wsgiref.handlers – server/gateway base classes
Этот модуль предоставляет базовые классы обработчиков для реализации 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. По умолчанию оно равно 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установлен, его значение используется для установки переменной окружения WSGISERVER_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¶ Фабрика
wsgi.file_wrapper, илиNone. Значение по умолчанию этого атрибута – классFileWrapperизwsgiref.util.
-
sendfile()¶ Переопределите для реализации передачи файлов, зависящей от платформы. Этот метод вызывается только в том случае, если возвращаемое значение приложения является экземпляром класса, указанного атрибутом
wsgi_file_wrapper. Он должен возвращать истинное значение, если файл был успешно передан, чтобы код передачи по умолчанию не выполнялся. Реализация этого метода по умолчанию просто возвращает ложное значение.
Разные методы и атрибуты:
-
origin_server¶ Этот атрибут должен быть установлен в истинное значение, если
_write()и_flush()обработчика используются для прямой связи с клиентом, а не через шлюзовой протокол типа CGI, который ожидает HTTP-статус в специальном заголовкеStatus:.Значение этого атрибута по умолчанию равно true в
BaseHandler, но false вBaseCGIHandlerиCGIHandler.
-
http_version¶ Если
origin_serverравно True, этот строковый атрибут используется для установки HTTP-версии ответа, отправляемого клиенту. По умолчанию он равен"1.0".
-
20.4.6. Примеры¶Examples
Это рабочее WSGI-приложение «Hello World»:
from wsgiref.simple_server import make_server
# Каждое WSGI-приложение должно иметь объект приложения – вызываемый
# объект, который принимает два аргумента. Для этого
# можно использовать функцию (обратите внимание: можно не только функцию, но и, например, класс)
# использовать, например, класс). Первый аргумент, передаваемый функции,
# это словарь, содержащий переменные окружения в стиле CGI, а
# вторая переменная – это вызываемый объект (см. PEP 333).
def hello_world_app(environ, start_response):
status = '200 OK' # HTTP-статус
headers = [('Content-type', 'text/plain')] # HTTP-заголовки
start_response(status, headers)
# Возвращаемый объект будет выведен
return ["Hello World"]
httpd = make_server('', 8000, hello_world_app)
print "Serving on port 8000..."
# Обслуживать до завершения процесса
httpd.serve_forever()