WSGI Помощники
Следующие классы и функции предназначены для облегчения работы со спецификацией WSGI или работы на уровне WSGI. Все функциональные возможности из этого модуля доступны на высоком уровне в классах Запрос / Ответ.
Помощники итераторов/потоков
Эти классы и функции упрощают работу с итератором приложения WSGI и входным потоком.
-
class werkzeug.wsgi.ClosingIterator(iterable, callbacks=None) -
Спецификация WSGI требует, чтобы все промежуточные ПО и шлюзы соблюдали обратный вызов
closeитерируемого объекта, возвращаемого приложением. Поскольку полезно добавить ещё одну операцию закрытия к возвращаемому итерируемому объекту, а добавление пользовательского итерируемого объекта — скучная задача, для этого можно использовать этот класс:return ClosingIterator(app(environ, start_response), [cleanup_session, cleanup_locals])Если существует только одна функция закрытия, её можно передать вместо списка.
Итератор закрытия не нужен, если приложение использует объекты ответа и завершает обработку, если запрос на ответ был инициирован:
try: return response(environ, start_response) finally: cleanup_session() cleanup_locals()
-
class werkzeug.wsgi.FileWrapper(file, buffer_size=8192) -
Этот класс может быть использован для преобразования объекта типа
fileв итерируемый объект. Он возвращает блокиbuffer_sizeдо тех пор, пока файл не будет полностью прочитан.Вы не должны использовать этот класс напрямую, а вместо этого используйте функцию
wrap_file(), которая использует поддержку обертки файла сервера WSGI, если она доступна.Изменения
Введено в версии 0.5.
Если вы используете этот объект вместе с
BaseResponse, вы должны использовать режимdirect_passthrough.Параметры: -
file – объект типа
fileс методомread(). - buffer_size – количество байтов для одной итерации.
-
file – объект типа
-
class werkzeug.wsgi.LimitedStream(stream, limit) -
Оборачивает поток, чтобы он не считывал более n байт. Если поток исчерпан, и вызывающий поток пытается получить больше байтов, вызывается
on_exhausted(), которая по умолчанию возвращает пустую строку. Возвращаемое значение этой функции передается в функцию чтения. Таким образом, если оно возвращает пустую строку,read()также вернёт пустую строку.Однако предел никогда не должен быть выше, чем то, что может выдать поток. В противном случае
readlines()попытается прочитать за пределы лимита.Примечание о соответствии WSGI
вызовы
readline()иreadlines()не соответствуют спецификации WSGI, потому что передают аргумент размера методам readline. К сожалению, PEP WSGI не может быть безопасно реализован без аргумента размера дляreadline(), потому что в потоке нет маркера EOF. В результате этого использованиеreadline()не рекомендуется.По той же причине итерирование по
LimitedStreamне переносимо. Оно внутренне вызываетreadline().Мы настоятельно рекомендуем использовать только
read()или использоватьmake_line_iter(), который безопасно итерирует по строкам входного потока WSGI.Параметры: - stream – поток для обертывания.
-
limit – предел для потока, не должен быть длиннее, чем то, что может предоставить строка, если поток не заканчивается
EOF(например,wsgi.input)
-
exhaust(chunk_size=65536) -
Исчерпать поток. Это потребляет все оставшиеся данные до достижения лимита.
Параметры: chunk_size – размер для блока. Он будет считывать блок до тех пор, пока поток не будет исчерпан, и игнорировать результаты.
-
is_exhausted -
Если поток исчерпан, это свойство
True.
-
on_disconnect() -
Что должно произойти, если обнаружено отключение? Возвращаемое значение этой функции возвращается из функций чтения в случае, если клиент ушел. По умолчанию генерируется исключение
ClientDisconnected.
-
on_exhausted() -
Вызывается, когда поток пытается прочитать за пределы лимита. Возвращаемое значение этой функции возвращается функцией чтения.
-
read(size=None) -
Прочитать
sizeбайт или, если размер не задан, прочитать всё.Параметры: size – количество считываемых байт.
-
readable() -
Возвращает, открыт ли объект для чтения.
Если False, read() вызовет OSError.
-
readline(size=None) -
Считывает одну строку из потока.
-
readlines(size=None) -
Читает файл в список строк. Он вызывает
readline()до тех пор, пока файл не будет прочитан до конца. Он поддерживает необязательныйsizeаргумент, если подлежащий поток его поддерживает дляreadline.
-
tell() -
Возвращает позицию потока.
Изменения
Введено в версии 0.9.
-
werkzeug.wsgi.make_line_iter(stream, limit=None, buffer_size=10240, cap_at_buffer=False) -
Безопасно итерируется по строкам входного потока. Если входной поток не является
LimitedStream, параметрlimitявляется обязательным.Это использует внутренний метод
read()потока, в отличие от методаreadline(), который небезопасен и может быть использован только в нарушение спецификации WSGI. Такая же проблема существует для функции__iter__входного потока, которая вызываетreadline()без аргументов.Если вам нужна обработка по строкам, настоятельно рекомендуется итерироваться по входному потоку, используя эту функцию-помощник.
Изменения
Введено в версии 0.11.10: добавлена поддержка параметра
cap_at_buffer.Введено в версии 0.9: добавлена поддержка итераторов в качестве входного потока.
Изменено в версии 0.8: Теперь эта функция гарантирует, что предел был достигнут.
Параметры: - stream – поток или итератор для итерирования.
-
limit – предел в байтах для потока. (Обычно длина содержимого. Необязательно, если
streamявляетсяLimitedStream. - buffer_size – необязательный размер буфера.
- cap_at_buffer – если это установлено, блоки разбиваются, если они длиннее размера буфера. Внутренне это реализовано так, что размер буфера может быть исчерпан в два раза.
-
werkzeug.wsgi.make_chunk_iter(stream, separator, limit=None, buffer_size=10240, cap_at_buffer=False) -
Действует аналогично
make_line_iter(), но принимает разделитель, который делит куски. Если вам нужна обработка на основе новой строки, используйтеmake_line_iter(), так как он поддерживает произвольные разделители строк.Журнал изменений
Добавлено в версии 0.11.10: добавлена поддержка параметра
cap_at_buffer.Добавлено в версии 0.9: добавлена поддержка итераторов в качестве входного потока.
Добавлено в версии 0.8.
Параметры: - stream – поток или итератор для итерации.
- separator – разделитель, который делит куски.
-
limit – ограничение в байтах для потока. (Обычно длина содержимого. Не нужно, если
streamуже ограничен иным способом). - buffer_size – необязательный размер буфера.
- cap_at_buffer – если этот параметр установлен, куски разбиваются, если они длиннее размера буфера. Внутренне это реализовано таким образом, что размер буфера может быть исчерпан в два раза.
-
werkzeug.wsgi.wrap_file(environ, file, buffer_size=8192) -
Оборачивает файл. Это использует оболочку файла сервера WSGI, если она доступна, или в противном случае общую оболочку
FileWrapper.Журнал изменений
Добавлено в версии 0.5.
Если используется оболочка файла сервера WSGI, важно не итерироваться по ней изнутри приложения, а передавать её без изменений. Если вы хотите передать оболочку файла внутри объекта ответа, необходимо установить
direct_passthroughнаTrue.Дополнительную информацию об оболочках файлов можно найти в PEP 333.
Параметры: -
file – объект, подобный
file, с методомread(). - buffer_size – количество байт для одной итерации.
-
file – объект, подобный
Справочные данные по окружению
Эти функции работают с окружением WSGI. Они извлекают полезную информацию или выполняют общие манипуляции:
-
werkzeug.wsgi.get_host(environ, trusted_hosts=None) -
Возвращает хост для данного окружения WSGI. Сначала проверяется заголовок
Host. Если его нет, то используютсяSERVER_NAMEиSERVER_PORT. Хост будет содержать порт только если он отличается от стандартного порта для протокола.По желанию, можно проверить, является ли хост доверенным, используя
host_is_trusted(), и вывестиSecurityError, если он не является доверенным.Параметры: - environ – окружение WSGI для получения хоста.
- trusted_hosts – список доверенных хостов.
Возвращает: Хост, с портом, если необходимо.
Исключения: SecurityError – Если хост не доверен.
-
werkzeug.wsgi.get_content_length(environ) -
Возвращает длину содержимого из окружения WSGI как целое число. Если оно недоступно или используется кодировка chunked, возвращается
None.Журнал изменений
Добавлено в версии 0.9.
Параметры: environ – окружение WSGI для извлечения длины содержимого.
-
werkzeug.wsgi.get_input_stream(environ, safe_fallback=True) -
Возвращает входной поток из окружения WSGI и оборачивает его наиболее разумным образом. Возвращаемый поток — не сырой поток WSGI в большинстве случаев, а безопасный для чтения без учёта длины содержимого.
Если длина содержимого не задана, поток будет пустым по соображениям безопасности. Если сервер WSGI поддерживает фрагментированные или бесконечные потоки, он должен установить значение
wsgi.input_terminatedв окружении WSGI, чтобы указать это.Журнал изменений
Добавлено в версии 0.9.
Параметры: - environ – окружение WSGI для извлечения потока.
- safe_fallback – использовать пустой поток в качестве безопасного резервного варианта, когда длина содержимого не задана. Отключение этого позволяет бесконечные потоки, что может быть риском для отказа в обслуживании.
-
werkzeug.wsgi.get_current_url(environ, root_only=False, strip_querystring=False, host_only=False, trusted_hosts=None) -
Удобная вспомогательная функция, которая воссоздаёт полный URL в виде IRI для текущего запроса или его частей. Вот пример:
>>> from werkzeug.test import create_environ >>> env = create_environ("/?param=foo", "http://localhost/script") >>> get_current_url(env) 'http://localhost/script/?param=foo' >>> get_current_url(env, root_only=True) 'http://localhost/script/' >>> get_current_url(env, host_only=True) 'http://localhost/' >>> get_current_url(env, strip_querystring=True) 'http://localhost/script/'Это по желанию проверяет, находится ли хост в списке доверенных хостов. Если хост там нет, будет вызвано
SecurityError.Обратите внимание, что возвращаемая строка может содержать символы Юникода, поскольку представление является IRI, а не URI. Если вам нужно представление только с ASCII-символами, вы можете использовать функцию
iri_to_uri():>>> from werkzeug.urls import iri_to_uri >>> iri_to_uri(get_current_url(env)) 'http://localhost/script/?param=foo'
Параметры: - environ – окружение WSGI для получения текущего URL.
-
root_only – установить
True, если вы хотите только корневой URL. -
strip_querystring – установить на
Trueесли вам не нужен параметр запроса. -
host_only – установить на
Trueесли должен быть возвращён только хост URL. -
trusted_hosts – список доверенных хостов, см.
host_is_trusted()для получения дополнительной информации.
-
werkzeug.wsgi.get_query_string(environ) -
Возвращает
QUERY_STRINGиз окружения WSGI. Это также обрабатывает танец декодирования WSGI в средах Python 3 как исходную строку. Возвращаемая строка будет ограничена ASCII-символами.Журнал изменений
Добавлено в версии 0.9.
Параметры: environ – объект окружения WSGI для получения строки запроса.
-
werkzeug.wsgi.get_script_name(environ, charset='utf-8', errors='replace') -
Возвращает
SCRIPT_NAMEиз окружения WSGI и правильно декодирует его. Это также обрабатывает танец декодирования WSGI в средах Python 3. Еслиcharsetустановлено наNone, возвращается строка байтов.Журнал изменений
Добавлено в версии 0.9.
Параметры: - environ – объект окружения WSGI для получения пути.
-
charset – кодировка символов для пути или
Noneесли декодирование не должно выполняться. - errors – обработка ошибок декодирования.
-
werkzeug.wsgi.get_path_info(environ, charset='utf-8', errors='replace') -
Возвращает
PATH_INFOиз окружения WSGI и правильно декодирует его. Это также обрабатывает танец декодирования WSGI в средах Python 3. Еслиcharsetустановлено наNone, возвращается строка байтов.Журнал изменений
Добавлено в версии 0.9.
Параметры: - environ – объект окружения WSGI для получения пути.
-
charset – кодировка символов для path info, или
Noneесли декодирование не должно выполняться. - errors – обработка ошибок декодирования.
-
werkzeug.wsgi.pop_path_info(environ, charset='utf-8', errors='replace') -
Удаляет и возвращает следующий сегмент
PATH_INFO, помещая его вSCRIPT_NAME. ВозвращаетNone, если вPATH_INFOничего не осталось.Если параметр
charsetустановлен вNone, возвращается строка байтов.Если есть пустые сегменты (
'/foo//bar) , они игнорируются, но корректно помещаются вSCRIPT_NAME:>>> env = {'SCRIPT_NAME': '/foo', 'PATH_INFO': '/a/b'} >>> pop_path_info(env) 'a' >>> env['SCRIPT_NAME'] '/foo/a' >>> pop_path_info(env) 'b' >>> env['SCRIPT_NAME'] '/foo/a/b'Changelog
Изменено в версии 0.9: Путь теперь декодируется, и можно указать параметр кодировки и набора символов.
Добавлен в версии 0.5.
Параметры: environ – среда WSGI, которая изменяется.
-
werkzeug.wsgi.peek_path_info(environ, charset='utf-8', errors='replace') -
Возвращает следующий сегмент в
PATH_INFOилиNone, если его нет. Работает так же, какpop_path_info(), но не изменяет среду:>>> env = {'SCRIPT_NAME': '/foo', 'PATH_INFO': '/a/b'} >>> peek_path_info(env) 'a' >>> peek_path_info(env) 'a'Если параметр
charsetустановлен вNone, возвращается строка байтов.Changelog
Изменено в версии 0.9: Путь теперь декодируется, и можно указать параметр кодировки и набора символов.
Добавлен в версии 0.5.
Параметры: environ – проверяемая среда WSGI.
-
werkzeug.wsgi.extract_path_info(environ_or_baseurl, path_or_url, charset='utf-8', errors='werkzeug.url_quote', collapse_http_schemes=True) -
Извлекает информацию о пути из заданного URL (или среды WSGI) и пути. Возвращаемая информация о пути — строка Unicode, а не строка байтов, подходящая для среды WSGI. URL также могут быть IRIs.
Если информация о пути не может быть определена, возвращается
None.Примеры:
>>> extract_path_info('http://example.com/app', '/app/hello') u'/hello' >>> extract_path_info('http://example.com/app', ... 'https://example.com/app/hello') u'/hello' >>> extract_path_info('http://example.com/app', ... 'https://example.com/app/hello', ... collapse_http_schemes=False) is None TrueВместо указания базового URL можно также передать среду WSGI.
Параметры: - environ_or_baseurl – словарь среды WSGI, базовый URL или базовый IRI. Это корень приложения.
- path_or_url – абсолютный путь от корня сервера, относительный путь (в этом случае это информация о пути) или полный URL. Также принимает IRIs и параметры Unicode.
- charset – набор символов для данных байтов в URL
- errors – обработка ошибок при декодировании
-
collapse_http_schemes – если установлено в
False, алгоритм не предполагает, что http и https на одном сервере указывают на один и тот же ресурс.
Changelog
Изменено в версии 0.15: Параметр
errorsпо умолчанию оставляет недопустимые байты в цитируемой форме вместо их замены.Добавлен в версии 0.6.
-
werkzeug.wsgi.host_is_trusted(hostname, trusted_list) -
Проверяет, является ли хост доверенным по отношению к списку. Это также обеспечивает нормализацию порта.
Changelog
Добавлен в версии 0.9.
Параметры: - hostname – проверяемый хост
- trusted_list – список хостов для проверки. Если имя хоста начинается с точки, оно будет соответствовать всем дочерним доменам.
Удобные вспомогательные функции
-
werkzeug.wsgi.responder(f) -
Помечает функцию как обработчик. Отметьте функцию с помощью неё, и она автоматически вызовет возвращаемое значение как WSGI-приложение.
Пример:
@responder def application(environ, start_response): return Response('Hello World!')
-
werkzeug.testapp.test_app(environ, start_response) -
Простое тестовое приложение, которое выводит среду. Вы можете использовать его для проверки корректной работы Werkzeug:
>>> from werkzeug.serving import run_simple >>> from werkzeug.testapp import test_app >>> run_simple('localhost', 3000, test_app) * Running on http://localhost:3000/Приложение отображает важную информацию из среды WSGI, интерпретатора Python и установленных библиотек.
Байты, строки и кодировки
Среда WSGI в Python 3 работает немного иначе, чем в Python 2. Werkzeug скрывает эти различия от вас, если вы используете интерфейсы высокого уровня.
Спецификация WSGI (PEP 3333) решила всегда использовать тип str . В Python 2 это означает, что необработанные байты передаются и могут быть непосредственно декодированы. Однако в Python 3 необработанные байты всегда декодируются с использованием набора символов ISO-8859-1, чтобы получить строку Unicode.
Строки Unicode в среде WSGI в Python 3 ограничены кодами символов ISO-8859-1. Если строка, считанная из среды, может содержать символы за пределами этого набора символов, она должна быть сначала декодирована в байты как ISO-8859-1, а затем закодирована в строку Unicode с использованием правильного набора символов (обычно UTF-8). Обратное выполняется при записи в среду. Это известно как «танцы кодирования WSGI».
Werkzeug предоставляет функции для автоматической обработки этого, поэтому вам не нужно знать внутренних механизмов. Используйте функции на этой странице, а также EnvironHeaders() для чтения данных из среды WSGI.
Приложения должны избегать ручного создания или изменения среды WSGI, если они не позаботятся о правильном кодировании или декодировании. Все интерфейсы высокого уровня в Werkzeug будут применять кодирование и декодирование по необходимости.
Необработанный URI запроса и кодировка пути
PATH_INFO в среде — это значение пути после декодирования процентов. Например, необработанный путь /hello%2fworld был бы показан сервером WSGI Werkzeug как /hello/world. Это теряет информацию о том, что косая черта была необработанным символом, а не разделителем пути.
Спецификация WSGI (PEP 3333) не предоставляет способа получения исходного значения, поэтому невозможно маршрутизировать некоторые типы данных в пути. Самый совместимый способ обойти это — передать проблемные данные в строке запроса вместо пути.
Однако многие серверы WSGI добавляют нестандартный ключ в environ с необработанным путем. Для соответствия этому поведению тестовый клиент и сервер разработки Werkzeug добавляют необработанное значение в ключи REQUEST_URI и RAW_URI. Если вы хотите маршрутизировать на основе этого значения, вы можете использовать middleware, чтобы заменить PATH_INFO в environ перед передачей его приложению. Однако имейте в виду, что эти ключи нестандартные и не гарантируются.
© 2007–2020 Pallets
Licensed under the BSD 3-clause License.
https://werkzeug.palletsprojects.com/en/1.0.x/wsgi/