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.
Если вы используете этот объект вместе с
Response, вы должны использовать режимdirect_passthrough.
-
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.- Параметры:
-
exhaust(chunk_size=65536) -
Исчерпайте поток. Это потребляет все оставшиеся данные до тех пор, пока не будет достигнут предел.
- Параметры:
-
chunk_size (int) – размер куска. Он будет читать кусок до тех пор, пока поток не будет исчерпан, и удалит результаты.
- Тип возвращаемого значения:
-
None
-
property is_exhausted: bool -
Если поток исчерпан, это свойство
True.
-
on_disconnect() -
Что должно произойти, если обнаружено отключение? Возвращаемое значение этой функции возвращается из функций чтения в случае ухода клиента. По умолчанию возникает исключение
ClientDisconnected.- Тип возвращаемого значения:
-
on_exhausted() -
Вызывается, когда поток пытается прочитать за пределами предела. Возвращаемое значение этой функции возвращается из функции чтения.
- Тип возвращаемого значения:
-
read(size=None) -
Прочитать
sizeбайтов или, если размер не указан, всё содержимое.
-
readable() -
Возвращает, был ли объект открыт для чтения.
Если False, read() вызовет OSError.
- Тип возвращаемого значения:
-
readline(size=None) -
Считывает одну строку из потока.
-
readlines(size=None) -
Читает файл в список строк. Он вызывает
readline()до тех пор, пока файл не будет полностью прочитан. Он поддерживает необязательный аргументsize, если базовый поток его поддерживает дляreadline.
-
tell() -
Возвращает позицию потока.
Changelog
Новое в версии 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 (Union[Iterable[bytes], IO[bytes]]) – поток или итератор для итерации.
-
limit (Optional[int]) – предел в байтах для потока. (Обычно длина содержимого. Не требуется, если
streamявляетсяLimitedStream. - buffer_size (int) – необязательный размер буфера.
- cap_at_buffer (bool) – если это установлено, куски разбиваются, если они длиннее размера буфера. Внутренне реализовано так, что размер буфера может быть исчерпан в два раза.
- Тип возвращаемого значения:
-
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 (Union[Iterable[bytes], IO[bytes]]) – поток или итератор для итерации.
- separator (bytes) – разделитель, который делит куски.
-
limit (Optional[int]) – предел в байтах для потока. (Обычно длина содержимого. Не требуется, если
streamуже ограничен). - buffer_size (int) – необязательный размер буфера.
- cap_at_buffer (bool) – если это установлено, куски разбиваются, если они длиннее размера буфера. Внутренне реализовано так, что размер буфера может быть исчерпан в два раза.
- Тип возвращаемого значения:
-
werkzeug.wsgi.wrap_file(environ, file, buffer_size=8192) -
Оборачивает файл. Использует оболочку файла сервера WSGI, если она доступна, или в противном случае оболочку
FileWrapper.Журнал изменений
Добавлен в версии 0.5.
Если используется оболочка файла сервера WSGI, важно не итерировать по ней внутри приложения, а передавать ее без изменений. Если вы хотите передать оболочку файла внутри объекта ответа, необходимо установить
Response.direct_passthroughнаTrue.Дополнительная информация об оболочках файлов доступна в PEP 333.
Справочные функции среды
Эти функции работают со средой WSGI. Они извлекают полезную информацию или выполняют общие манипуляции:
-
werkzeug.wsgi.get_host(environ, trusted_hosts=None) -
Возвращает хост для данной среды WSGI.
Заголовок
Hostпредпочтительнее, затемSERVER_NAME, если он не задан. Возвращаемый хост будет содержать порт только если он отличается от стандартного порта для протокола.Необязательно, можно проверить, является ли хост надёжным, используя
host_is_trusted()и выбросить исключениеSecurityError, если он ненадёжный.- Параметры:
- Возвращает:
-
Хост с портом, если необходимо.
- Возможные исключения:
-
SecurityError – Если хост ненадёжный.
- Тип возвращаемого значения:
-
werkzeug.wsgi.get_content_length(environ) -
Возвращает длину содержимого из среды WSGI как целое число. Если она недоступна или используется кодировка передачи блоками, возвращается
None.Журнал изменений
Новая в версии 0.9.
-
werkzeug.wsgi.get_input_stream(environ, safe_fallback=True) -
Возвращает поток ввода из среды WSGI и оборачивает его наиболее подходящим образом. Возвращаемый поток — это не исходный поток WSGI в большинстве случаев, а поток, который безопасно читать без учёта длины содержимого.
Если длина содержимого не задана, поток будет пустым по соображениям безопасности. Если сервер WSGI поддерживает потоки блоками или бесконечные потоки, он должен установить значение
wsgi.input_terminatedв среде WSGI, чтобы указать это.Журнал изменений
Новая в версии 0.9.
- Параметры:
-
- environ (WSGIEnvironment) – среда WSGI для извлечения потока.
- safe_fallback (bool) – использовать пустой поток в качестве безопасного резервного варианта, когда длина содержимого не задана. Отключение этого позволяет бесконечные потоки, что может представлять собой риск отключения обслуживания.
- Тип возвращаемого значения:
-
werkzeug.wsgi.get_current_url(environ, root_only=False, strip_querystring=False, host_only=False, trusted_hosts=None) -
Воссоздаёт URL для запроса из частей в среде WSGI.
URL является IRI, а не URI, поэтому он может содержать символы Юникода. Используйте
iri_to_uri(), чтобы преобразовать его в ASCII.- Параметры:
-
- environ (WSGIEnvironment) – среда WSGI для получения частей URL.
- root_only (bool) – построить только корневой путь, не включать оставшуюся часть пути или строку запроса.
- strip_querystring (bool) – не включать строку запроса.
- host_only (bool) – построить только схему и хост.
- trusted_hosts (Optional[Iterable[str]]) – список надёжных имён хостов для проверки хоста.
- Тип возвращаемого значения:
-
werkzeug.wsgi.get_query_string(environ) -
Возвращает строку запроса из среды WSGI. Это также обрабатывает WSGI-декодирование. Возвращаемая строка будет ограничена ASCII-символами.
- Параметры:
-
environ (WSGIEnvironment) – среда WSGI для извлечения строки запроса.
- Тип возвращаемого значения:
Устарело начиная с версии 2.2: Будет удалено в Werkzeug 2.3.
Журнал изменений
Новая в версии 0.9.
-
werkzeug.wsgi.get_script_name(environ, charset='utf-8', errors='replace') -
Возвращает имя скрипта из среды WSGI и декодирует его, если
charsetне установлено вNone.- Параметры:
- Тип возвращаемого значения:
Устарело начиная с версии 2.2: Будет удалено в Werkzeug 2.3.
Журнал изменений
Новая в версии 0.9.
-
werkzeug.wsgi.get_path_info(environ, charset='utf-8', errors='replace') -
Возвращает информацию о пути из среды WSGI и декодирует её, если
charsetне равноNone.- Параметры:
- Тип возвращаемого значения:
Журнал изменений
Новая в версии 0.9.
-
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'Устарело начиная с версии 2.2: Будет удалено в Werkzeug 2.3.
Изменения
Изменено в версии 0.9: Путь теперь декодируется, и можно указать параметр кодировки и набора символов.
Добавлена в версии 0.5.
-
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байт возвращаются.Устарело начиная с версии 2.2: Будет удалено в Werkzeug 2.3.
Изменения
Изменено в версии 0.9: Путь теперь декодируется, и можно указать параметр кодировки и набора символов.
Добавлена в версии 0.5.
-
werkzeug.wsgi.extract_path_info(environ_or_baseurl, path_or_url, charset='utf-8', errors='werkzeug.url_quote', collapse_http_schemes=True) -
Извлекает информацию о пути из заданного URL (или среды WSGI) и пути. Возвращаемая информация о пути — это строка. URL также могут быть IRIs.
Если информация о пути не может быть определена, возвращается
None.Примеры:
>>> extract_path_info('http://example.com/app', '/app/hello') '/hello' >>> extract_path_info('http://example.com/app', ... 'https://example.com/app/hello') '/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 (Union[str, WSGIEnvironment]) – словарь среды WSGI, базовый URL или базовый IRI. Это корень приложения.
- path_or_url (Union[str, _URLTuple]) – абсолютный путь от корня сервера, относительный путь (в этом случае это информация о пути) или полный URL.
- charset (str) – набор символов для байтовых данных в URL
- errors (str) – обработка ошибок при декодировании
-
collapse_http_schemes (bool) – если установлено в
False, алгоритм не предполагает, что http и https на одном сервере указывают на один и тот же ресурс.
- Тип возвращаемого значения:
Устарело начиная с версии 2.2: Будет удалено в Werkzeug 2.3.
Изменения
Изменено в версии 0.15: Параметр
errorsпо умолчанию оставляет недопустимые байты в кавычках вместо их замены.Добавлена в версии 0.6.
-
werkzeug.wsgi.host_is_trusted(hostname, trusted_list) -
Проверяет, соответствует ли хост списку доверенных имен.
- Параметры:
- Тип возвращаемого значения:
Изменения
Добавлена в версии 0.9.
Дополнительные утилиты
-
werkzeug.wsgi.responder(f) -
Помечает функцию как ответчик. Украсьте функцию ею, и она автоматически вызовет возвращаемое значение в качестве приложения WSGI.
Пример:
@responder def application(environ, start_response): return Response('Hello World!')- Параметры:
-
f (Callable[[...], WSGIApplication]) –
- Тип возвращаемого значения:
-
WSGIApplication
-
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 и установленных библиотек.
Байты, строки и кодировки
Значения в запросах HTTP поступают в виде байтов, представляющих (или закодированных в) ASCII. Спецификация WSGI (PEP 3333) решила всегда использовать тип str для представления значений. Для этого исходные байты декодируются с помощью кодировки ISO-8859-1, чтобы получить строку.
Строки в среде WSGI ограничены кодовыми точками ISO-8859-1. Если строка, считанная из среды, может содержать символы за пределами этой кодировки, её необходимо сначала декодировать в байты как ISO-8859-1, а затем закодировать в строку с использованием соответствующей кодировки (обычно UTF-8). Обратное выполняется при записи в environ. Это известно как «танцы с кодировками WSGI».
Werkzeug предоставляет функции для автоматической обработки этого, чтобы вам не нужно было знать внутренние механизмы. Используйте функции на этой странице, а также EnvironHeaders() для чтения данных из среды WSGI.
Приложения должны избегать ручного создания или изменения среды WSGI, если не позаботятся о правильном кодировании или декодировании. Все интерфейсы высокого уровня в Werkzeug будут применять кодирование и декодирование по мере необходимости.
Исходное кодирование URI запроса и пути
PATH_INFO в environ — это значение пути после декодирования процентов. Например, исходный путь /hello%2fworld будет отображаться WSGI-сервером для Werkzeug как /hello/world. Это теряет информацию о том, что слэш был исходным символом, а не разделителем пути.
Спецификация WSGI (PEP 3333) не предоставляет способ получить исходное значение, поэтому невозможно маршрутизировать некоторые типы данных в пути. Наиболее совместимый способ обойти это — отправлять проблемные данные в строке запроса вместо пути.
Однако многие WSGI-серверы добавляют нестандартный ключ environ с исходным путём. Для соответствия этому поведению тестовый клиент и сервер разработки Werkzeug добавляют исходное значение в ключи REQUEST_URI и RAW_URI. Если вы хотите маршрутизировать на основе этого значения, вы можете использовать промежуточное ПО для замены PATH_INFO в environ перед передачей его приложению. Однако помните, что эти ключи нестандартны и не гарантируются.
© 2007–2022 Pallets
Licensed under the BSD 3-clause License.
https://werkzeug.palletsprojects.com/en/2.2.x/wsgi/