Утилиты HTTP
Werkzeug предоставляет несколько функций для разбора и генерации заголовков HTTP, которые полезны при реализации WSGI-миддлверов или при работе на более низком уровне. Весь этот функционал также доступен из объектов запроса и ответа.
Функции работы со временем
Эти функции упрощают работу со временем в контексте HTTP. Werkzeug генерирует объекты datetime с учетом часового пояса в UTC. При передаче объектов datetime в Werkzeug, предполагается, что любой неявный объект datetime находится в UTC.
При сравнении значений datetime из Werkzeug, ваши собственные объекты datetime также должны учитывать часовой пояс, или вы должны сделать значения из Werkzeug неявными.
-
dt = datetime.now(timezone.utc)получает текущее время в UTC. -
dt = datetime(..., tzinfo=timezone.utc)создает время в UTC. -
dt = dt.replace(tzinfo=timezone.utc)делает неявный объект явным, предполагая, что он находится в UTC. -
dt = dt.replace(tzinfo=None)делает явный объект неявным.
-
werkzeug.http.parse_date(value) Разбирает дату в формате RFC 2822 в объект timezone-aware
datetime.datetimeилиNoneв случае неудачи.Это обертка для
email.utils.parsedate_to_datetime(). ВозвращаетNoneв случае неудачи, вместо возбуждения исключения, и всегда возвращает объект datetime с учетом часового пояса. Если в строке нет информации о часовом поясе, предполагается, что это UTC.- Параметры:
value (str | None) – Строка с поддерживаемым форматом даты.
- Тип возвращаемого значения:
datetime | None
Изменения
Изменено в версии 2.0: Возвращает объект datetime с учетом часового пояса. Используйте
email.utils.parsedate_to_datetime.
-
werkzeug.http.http_date(timestamp=None) Форматирует объект datetime или временную метку в строку даты в формате RFC 2822.
Это обертка для
email.utils.format_datetime(). Предполагается, что неявные объекты datetime находятся в UTC, вместо возбуждения исключения.- Параметры:
timestamp (datetime | date | int | float | struct_time | None) – Объект datetime или временная метка для форматирования. По умолчанию используется текущее время.
- Тип возвращаемого значения:
Изменения
Изменено в версии 2.0: Используйте
email.utils.format_datetime. Принимайте объектыdate.
Парсинг заголовков
Следующие функции могут быть использованы для парсинга входящих HTTP-заголовков. Поскольку Python не предоставляет структуры данных с семантикой, необходимой RFC 2616, Werkzeug реализует некоторые пользовательские структуры данных, которые документированы отдельно.
-
werkzeug.http.parse_options_header(value) -
Разбирает заголовок, состоящий из значения с
key=valueпараметрами, разделенными точками с запятой;. Например, заголовокContent-Type.parse_options_header("text/html; charset=UTF-8") ('text/html', {'charset': 'UTF-8'}) parse_options_header("") ("", {})Это обратная функция
dump_options_header().Парсит допустимые части параметров, как описано в RFC 9110. Недопустимые части пропускаются.
Обрабатывает продолжения и кодировки символов, как описано в RFC 2231, хотя и не так строго, как в RFC. Принимаются только кодировки ASCII, UTF-8 и ISO-8859-1, в противном случае значение остается в кавычках.
Клиенты могут быть не согласованны в том, как они обрабатывают символ кавычки внутри значения в кавычках. Стандарт HTML заменяет его на
%22в данных multipart-формы. RFC 9110 использует обратные слэши для экранирования в HTTP-заголовках. Оба декодируются в символ".Клиенты могут не согласовываться в том, как обрабатывать не-ASCII символы. HTML-документы должны объявлять
<meta charset=UTF-8>, в противном случае браузеры могут заменить их ссылками на HTML-символы, которые можно декодировать, используяhtml.unescape().- Параметры:
-
value (str | None) – Значение заголовка для парсинга.
- Возвращает:
-
(value, options), гдеoptions— это словарь. - Тип возвращаемого значения:
Изменено в версии 2.3: Недопустимые части, такие как ключи без значения, ключи в кавычках и неправильно обрамлённые значения, отбрасываются вместо того, чтобы рассматриваться как
None.Изменено в версии 2.3: Для значений charset принимаются только ASCII, UTF-8 и ISO-8859-1.
Изменено в версии 2.3: Обрабатываются экранированные кавычки в значениях в кавычках, такие как
%22и\".Журнал изменений
Изменено в версии 2.2: Имена параметров всегда преобразуются в нижний регистр.
Изменено в версии 2.2: Параметр
multipleбыл удалён.Изменено в версии 0.15: Обрабатываются продолжения параметров RFC 2231.
Добавлено в версии 0.5.
-
werkzeug.http.parse_set_header(value, on_update=None) -
Разбирает заголовок типа «множество» и возвращает объект
HeaderSet:>>> hs = parse_set_header('token, "quoted value"')Возвращаемое значение — объект, который обрабатывает элементы без учета регистра и сохраняет порядок элементов:
>>> 'TOKEN' in hs True >>> hs.index('quoted value') 1 >>> hs HeaderSet(['token', 'quoted value'])Чтобы снова создать заголовок из
HeaderSetиспользуйте функциюdump_header().
-
werkzeug.http.parse_list_header(value) -
Разбирает значение заголовка, состоящего из списка элементов, разделенных запятыми, согласно RFC 9110.
Расширяет
urllib.request.parse_http_list()для удаления окружающих кавычек из значений.parse_list_header('token, "quoted value"') ['token', 'quoted value']Это обратная функция
dump_header().
-
werkzeug.http.parse_dict_header(value, cls=None) -
Разбирает заголовок списка с помощью
parse_list_header(), затем разбирает каждый элемент как пару «ключ-значение».parse_dict_header('a=b, c="d, e", f') {"a": "b", "c": "d, e", "f": None}Это обратная функция
dump_header().Если ключ не имеет значения, он
None.Обрабатывает кодировки символов для значений, как описано в RFC 2231. Принимаются только кодировки ASCII, UTF-8 и ISO-8859-1, в противном случае значение остается в кавычках.
- Параметры:
- Тип возвращаемого значения:
Изменено в версии 2.3: Добавлена поддержка элементов, закодированных в
key*=charset''value.Изменено в версии 2.3: Передача байтов устарела, поддержка будет удалена в Werkzeug 3.0.
Изменено в версии 2.3: Аргумент
clsустарел и будет удален в Werkzeug 3.0.Журнал изменений
Изменено в версии 0.9: Добавлен аргумент
cls.
-
werkzeug.http.parse_accept_header(value: str | None) → Accept - werkzeug.http.parse_accept_header(value:str|None, cls:type[_TAnyAccept]) _TAnyAccept
-
Разбор заголовка
Acceptв соответствии с RFC 9110.Возвращает экземпляр
Accept, который может сортировать и проверять элементы на основе их параметра качества. При разбореAccept-Charset,Accept-Encoding, илиAccept-Language, используйте соответствующий подклассAccept.- Параметры:
-
- value – Значение заголовка для разбора.
-
cls – Класс
Acceptдля обертывания результата.
- Возвращает:
-
Экземпляр
cls.
Изменено в версии 2.3: Разбор в соответствии с RFC 9110. Элементы с недопустимыми значениями
qпропускаются.
-
werkzeug.http.parse_cache_control_header(value: str | None, on_update: Callable[[_TAnyCC], None] | None, cls: None = None) → RequestCacheControl - werkzeug.http.parse_cache_control_header(value:str|None, on_update:Callable[[_TAnyCC],None]|None, cls:type[_TAnyCC]) _TAnyCC
-
Разбор заголовка управления кэшем. RFC отличается между кэшированием ответа и запроса, этот метод не различает их. Вам необходимо убедиться, что вы используете правильные команды.
Журнал изменений
Добавлена в версии 0.5: Добавлен
cls. Если не указано иное, возвращается неизменяемыйRequestCacheControl.- Параметры:
-
- value – заголовок управления кэшем для разбора.
-
on_update – необязательный вызываемый объект, который вызывается каждый раз, когда значение объекта
CacheControlизменяется. -
cls – класс для возвращаемого объекта. По умолчанию используется
RequestCacheControl.
- Возвращает:
-
объект
cls.
-
werkzeug.http.parse_authorization_header(value) -
Разбор HTTP-заголовка авторизации basic/digest, передаваемого веб-браузером. Возвращаемое значение —
Noneесли заголовок недопустим или отсутствует, в противном случае — объектAuthorization.- Параметры:
-
value (str | None) – заголовок авторизации для разбора.
- Возвращает:
-
объект
AuthorizationилиNone. - Тип возвращаемого значения:
-
Authorization | None
Устарело начиная с версии 2.3: Будет удалено в Werkzeug 3.0. Используйте
Authorization.from_header()вместо этого.
-
werkzeug.http.parse_www_authenticate_header(value, on_update=None) -
Разбор заголовка HTTP WWW-Authenticate в объект
WWWAuthenticate.- Параметры:
-
- value (str | None) – заголовок WWW-Authenticate для разбора.
-
on_update (Callable[[WWWAuthenticate], None] | None) – необязательный вызываемый объект, который вызывается каждый раз, когда значение объекта
WWWAuthenticateизменяется.
- Возвращает:
-
объект
WWWAuthenticate. - Тип возвращаемого значения:
Устарело начиная с версии 2.3: Будет удалено в Werkzeug 3.0. Используйте
WWWAuthenticate.from_header()вместо этого.
-
werkzeug.http.parse_if_range_header(value) -
Разбирает заголовок if-range, который может быть тегом ETag или датой. Возвращает объект
IfRange.Журнал изменений
Изменено в версии 2.0: Если значение представляет дату, оно учитывает часовой пояс.
Добавлена в версии 0.7.
-
werkzeug.http.parse_range_header(value, make_inclusive=True) -
Разбирает заголовок диапазона в объект
Range. Если заголовок отсутствует или имеет неправильный формат, возвращаетсяNone.ranges— это список(start, stop)кортежей, где диапазоны не включают граничные значения.Журнал изменений
Новая версия с 0.7.
-
werkzeug.http.parse_content_range_header(value, on_update=None) -
Разбирает заголовок диапазона в объект
ContentRangeилиNone, если разбор невозможен.Журнал изменений
Новая версия с 0.7.
- Параметры:
-
- value (str | None) – анализируемый заголовок диапазона содержимого.
-
on_update (Callable[[ContentRange], None] | None) – необязательная функция, которая вызывается каждый раз, когда изменяется значение в объекте
ContentRange.
- Тип возвращаемого значения:
-
ContentRange | None
Утилиты заголовков
Следующие утилиты работают хорошо с HTTP-заголовками, но не анализируют их. Они полезны, если вы работаете с условными ответами или если хотите проксировать произвольные запросы, но хотите удалить неподдерживаемые WSGI заголовки «hop-by-hop». Также есть функция для создания строк HTTP-заголовков из проанализированных данных.
-
werkzeug.http.is_entity_header(header) -
Проверка, является ли заголовок заголовком сущности.
Журнал изменений
Новая в версии 0.5.
-
werkzeug.http.is_hop_by_hop_header(header) -
Проверка, является ли заголовок заголовком «Hop-by-Hop» HTTP/1.1.
Журнал изменений
Новая в версии 0.5.
-
werkzeug.http.remove_entity_headers(headers, allowed=('expires', 'content-location')) -
Удаление всех заголовков сущностей из списка или
Headersобъекта. Эта операция выполняется на месте.ExpiresиContent-Locationзаголовки по умолчанию не удаляются. Причина в этом заключается в RFC 2616 разделе 10.3.5, который определяет некоторые заголовки сущностей, которые должны быть отправлены.Журнал изменений
Изменено в версии 0.5: добавлено
allowedпараметр.
-
werkzeug.http.remove_hop_by_hop_headers(headers) -
Удаление всех заголовков «Hop-by-Hop» HTTP/1.1 из списка или
Headersобъекта. Эта операция выполняется на месте.Журнал изменений
Новая в версии 0.5.
-
werkzeug.http.is_byte_range_valid(start, stop, length) -
Проверяет, является ли заданный диапазон байтов допустимым для заданной длины.
Журнал изменений
Новая в версии 0.7.
-
werkzeug.http.quote_header_value(value, extra_chars=None, allow_token=True) -
Добавление двойных кавычек вокруг значения заголовка. Если заголовок содержит только символы ASCII-токенов, он будет возвращен без изменений. Если заголовок содержит
"или\символы, они будут экранированы с помощью дополнительного\символа.Это обратное действие для
unquote_header_value().- Параметры:
- Тип возвращаемого значения:
Изменено в версии 2.3: Значение присваивается в кавычки, если это пустая строка.
Изменено в версии 2.3: Передача байтов устарела и не будет поддерживаться в Werkzeug 3.0.
Изменено в версии 2.3: Параметр
extra_charsустарел и будет удален в Werkzeug 3.0.Журнал изменений
Новая в версии 0.5.
-
werkzeug.http.unquote_header_value(value, is_filename=None) -
Удаление двойных кавычек и декодирование экранированных косыми чертами
"и\символов в значении заголовка.Это обратное действие для
quote_header_value().- Параметры:
- Тип возвращаемого значения:
Изменено в версии 2.3: Параметр
is_filenameустарел и будет удален в Werkzeug 3.0.
-
werkzeug.http.dump_header(iterable, allow_token=None) -
Создать значение заголовка из списка элементов или пар «ключ-значение», разделённых запятыми
,.Это обратное преобразование к
parse_list_header(),parse_dict_header()иparse_set_header().Если значение содержит неразрешённые символы, оно будет взято в кавычки.
Если значение является
None, ключ выводится отдельно.В некоторых ключах для некоторых заголовков значение UTF-8 может быть закодировано с помощью специального
key*=UTF-8''valueформата, гдеvalueкодируется в процентах. Эта функция не будет автоматически генерировать этот формат, но если заданный ключ оканчивается на звёздочку*, значение предполагается в этом формате и не будет взято в кавычки.dump_header(["foo", "bar baz"]) 'foo, "bar baz"' dump_header({"foo": "bar baz"}) 'foo="bar baz"'- Параметры:
- Тип возвращаемого значения:
Изменено в версии 2.3: Параметр
allow_tokenустарел и будет удалён в Werkzeug 3.0.Журнал изменений
Изменено в версии 2.2.3: Если ключ оканчивается на
*, его значение не будет взято в кавычки.
Справочные данные для условных ответов
Для условных ответов могут быть полезны следующие функции:
-
werkzeug.http.parse_etags(value) -
Разбор заголовка etag.
-
werkzeug.http.quote_etag(etag, weak=False) -
Приведение тега etag в кавычки.
-
werkzeug.http.unquote_etag(etag) -
Извлечение значения одиночного тега etag:
>>> unquote_etag('W/"bar"') ('bar', True) >>> unquote_etag('"bar"') ('bar', False)
-
werkzeug.http.generate_etag(data) -
Генерация тега etag для некоторых данных.
Журнал изменений
Изменено в версии 2.0: Использование SHA-1. MD5 может быть недоступен в некоторых средах.
-
werkzeug.http.is_resource_modified(environ, etag=None, data=None, last_modified=None, ignore_if_range=True) -
Удобный метод для условных запросов.
- Параметры:
-
- environ (WSGIEnvironment) – окружение WSGI запроса для проверки.
- etag (str | None) – тег etag для ответа для сравнения.
-
data (bytes | None) – или, как альтернатива, данные ответа для автоматической генерации тега etag с помощью
generate_etag(). - last_modified (datetime | str | None) – необязательная дата последнего изменения.
-
ignore_if_range (bool) – Если
False, заголовокIf-Rangeбудет принят во внимание.
- Возвращаемое значение:
-
Trueесли ресурс был изменён, в противном случаеFalse. - Тип возвращаемого значения:
Журнал изменений
Изменено в версии 2.0: SHA-1 используется для генерации значения тега etag для данных. MD5 может быть недоступен в некоторых средах.
Изменено в версии 1.0.0: Проверка выполняется для методов, отличных от
GETиHEAD.
Константы
-
werkzeug.http.HTTP_STATUS_CODES -
Словарь пар «код состояния» -> «сообщение состояния по умолчанию». Используется обёртками и другими местами в Werkzeug, где целое число кода состояния расшифровывается в строку.
Парсинг данных формы
Werkzeug предоставляет функции парсинга формы отдельно от объекта запроса, чтобы вы могли получить доступ к данным формы из обычной среды WSGI.
В настоящее время парсер данных формы поддерживает следующие форматы:
application/x-www-form-urlencodedmultipart/form-data
Вложенный multipart в настоящее время не поддерживается (Werkzeug 0.9), но не используется ни одним из современных веб-браузеров.
Пример использования:
>>> from io import BytesIO
>>> from werkzeug.formparser import parse_form_data
>>> data = (
... b'--foo\r\nContent-Disposition: form-data; name="test"\r\n'
... b"\r\nHello World!\r\n--foo--"
... )
>>> environ = {
... "wsgi.input": BytesIO(data),
... "CONTENT_LENGTH": str(len(data)),
... "CONTENT_TYPE": "multipart/form-data; boundary=foo",
... "REQUEST_METHOD": "POST",
... }
>>> stream, form, files = parse_form_data(environ)
>>> stream.read()
b''
>>> form['test']
'Hello World!'
>>> not files
True
Обычно среда WSGI предоставляется шлюзом WSGI с поступающими данными как частью среды. Если вы хотите сгенерировать такие поддельные среды WSGI для тестирования в среде разработки, вы можете использовать функцию create_environ() или EnvironBuilder.
-
class werkzeug.formparser.FormDataParser(stream_factory=None, charset=None, errors=None, max_form_memory_size=None, max_content_length=None, cls=None, silent=True, *, max_form_parts=None) -
Этот класс реализует парсинг данных формы для Werkzeug. Сам по себе он может парсить данные формы в формате multipart и url-encoded. Его можно наследоваться и расширять, но для большинства MIME-типов лучше использовать нетронутый поток и экспонировать его как отдельные атрибуты в объекте запроса.
- Параметры:
-
-
stream_factory (TStreamFactory | None) – Необязательное вызываемое значение, которое возвращает новый читаемый и записываемый дескриптор файла. Это вызываемое значение работает так же, как
Response._get_file_stream(). -
max_form_memory_size (int | None) – максимальное количество байтов, принимаемое для хранения данных формы в памяти. Если данные превышают указанное значение, возникает исключение
RequestEntityTooLarge. -
max_content_length (int | None) – Если это значение указано, а переданные данные длиннее этого значения, возникает исключение
RequestEntityTooLarge. -
cls (type[MultiDict] | None) – необязательный класс словаря для использования. Если это значение не указано или
Noneиспользуется значение по умолчаниюMultiDict. - silent (bool) – Если значение установлено в False, ошибки парсинга не будут перехвачены.
-
max_form_parts (int | None) – Максимальное количество частей multipart, подлежащих парсингу. Если это значение превышено, возникает исключение
RequestEntityTooLarge. - charset (str | None) –
- errors (str | None) –
-
stream_factory (TStreamFactory | None) – Необязательное вызываемое значение, которое возвращает новый читаемый и записываемый дескриптор файла. Это вызываемое значение работает так же, как
Изменено в версии 2.3: Параметры
charsetиerrorsустарели и будут удалены в Werkzeug 3.0.Изменено в версии 2.3: Атрибут
parse_functionsи методыget_parse_funcустарели и будут удалены в Werkzeug 3.0.Журнал изменений
Изменено в версии 2.2.3: Добавлен параметр
max_form_parts.Введено в версии 0.8.
-
werkzeug.formparser.parse_form_data(environ, stream_factory=None, charset=None, errors=None, max_form_memory_size=None, max_content_length=None, cls=None, silent=True, *, max_form_parts=None) -
Обработайте данные формы в environ и верните их в виде кортежа в форме
(stream, form, files). Вы должны вызывать этот метод только если метод транспортаPOST,PUT, илиPATCH.Если MIME-тип переданных данных
multipart/form-data, многослойный словарь файлов будет заполнен объектамиFileStorage. Если MIME-тип неизвестен, входной поток обертывается и возвращается в качестве первого аргумента, в противном случае поток пустой.Это сокращение для общего использования
FormDataParser.- Параметры:
-
- environ (WSGIEnvironment) – среда WSGI, используемая для парсинга.
-
stream_factory (TStreamFactory | None) – Необязательное вызываемое значение, которое возвращает новый читаемый и записываемый дескриптор файла. Это вызываемое значение работает так же, как
Response._get_file_stream(). -
max_form_memory_size (int | None) – максимальное количество байтов, принимаемое для хранения данных формы в памяти. Если данные превышают указанное значение, возникает исключение
RequestEntityTooLarge. -
max_content_length (int | None) – Если это значение указано, а переданные данные длиннее этого значения, возникает исключение
RequestEntityTooLarge. -
cls (type[MultiDict] | None) – необязательный класс словаря для использования. Если это значение не указано или
Noneиспользуется значение по умолчаниюMultiDict. - silent (bool) – Если значение установлено в False, ошибки парсинга не будут перехвачены.
-
max_form_parts (int | None) – Максимальное количество частей multipart, подлежащих парсингу. Если это значение превышено, возникает исключение
RequestEntityTooLarge. - charset (str | None) –
- errors (str | None) –
- Возвращает:
-
Кортеж в форме
(stream, form, files). - Тип возвращаемого значения:
-
t_parse_result
Изменено в версии 2.3: Добавлен параметр
max_form_parts.Изменено в версии 2.3: Параметры
charsetиerrorsустарели и будут удалены в Werkzeug 3.0.Журнал изменений
Введено в версии 0.5.1: Добавлен параметр
silent.Введено в версии 0.5: Добавлены параметры
max_form_memory_size,max_content_length, иcls.
© 2007–2022 Pallets
Licensed under the BSD 3-clause License.
https://werkzeug.palletsprojects.com/en/2.3.x/http/