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 в объект
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: Принимаются только 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) -
Разбирает заголовок списка с помощью
parse_list_header(), затем разбирает каждый элемент как паруkey=value.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, в противном случае значение остаётся в кавычках.
- Параметры:
-
value (str) – Значение заголовка для парсинга.
- Тип возвращаемого значения:
Журнал изменений
Изменено в версии 3.0: Передача байтов не поддерживается.
Изменено в версии 3.0: Аргумент
clsудалён.Изменено в версии 2.3: Добавлена поддержка
key*=charset''valueзакодированных элементов.Изменено в версии 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[[_CacheControl], None] | None = None) → RequestCacheControl - werkzeug.http.parse_cache_control_header(value:str|None, on_update:Callable[[_CacheControl],None]|None=None, cls:type[_TAnyCC]=None) _TAnyCC
-
Разбор заголовка управления кэшем. RFC отличается между кэшированием ответа и запроса, этот метод этого не делает. Вам нужно самостоятельно следить за тем, чтобы использовать правильные инструкции.
Журнал изменений
Добавлен в версии 0.5: Была добавлена
cls. Если не указано, возвращается неизменяемыйRequestCacheControl.- Параметры:
-
- value – заголовок управления кэшем для разбора.
-
on_update – необязаемая функция, которая вызывается каждый раз при изменении значения в объекте
CacheControl. -
cls – класс для возвращаемого объекта. По умолчанию используется
RequestCacheControl.
- Возвращаемое значение:
-
объект
cls.
-
werkzeug.http.parse_if_range_header(value) -
Разбирает заголовок if-range, который может быть тегом или датой. Возвращает объект
IfRange.Журнал изменений
Изменено в версии 2.0: Если значение представляет дату, она является часо-поясной.
Добавлен в версии 0.7.
-
werkzeug.http.parse_range_header(value, make_inclusive=True) -
Разбирает заголовок range в объект
Range. Если заголовок отсутствует или имеет неверный формат, возвращаетсяNone.ranges— список(start, stop)кортежей, где диапазоны не включают граничные значения.Журнал изменений
Добавлен в версии 0.7.
-
werkzeug.http.parse_content_range_header(value, on_update=None) -
Разбирает заголовок диапазона в объект
ContentRangeилиNoneесли разбор невозможен.Журнал изменений
Добавлен в версии 0.7.
- Параметры:
-
- value (str | None) – заголовок content-range для разбора.
-
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) -
Проверить, является ли заголовок HTTP/1.1 заголовком «Hop-by-Hop».
Журнал изменений
Добавлен в версии 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) -
Удалить все HTTP/1.1 заголовки «Hop-by-Hop» из списка или
Headersобъекта. Эта операция работает на месте.Журнал изменений
Добавлен в версии 0.5.
-
werkzeug.http.is_byte_range_valid(start, stop, length) -
Проверяет, является ли заданный байтовый диапазон допустимым для заданной длины.
Журнал изменений
Добавлен в версии 0.7.
-
werkzeug.http.quote_header_value(value, allow_token=True) -
Добавить двойные кавычки вокруг значения заголовка. Если заголовок содержит только символы ASCII-токенов, он будет возвращен без изменений. Если заголовок содержит
"или\символы, они будут экранированы с добавлением\символа.Это обратное
unquote_header_value().- Параметры:
- Тип возвращаемого значения:
Журнал изменений
Изменено в версии 3.0: Передача байтов не поддерживается.
Изменено в версии 3.0: Параметр
extra_charsудалён.Изменено в версии 2.3: Значение цитируется, если оно является пустой строкой.
Добавлен в версии 0.5.
-
werkzeug.http.unquote_header_value(value) -
Удалить двойные кавычки и декодировать экранированные с помощью слэша
"и\символы в значении заголовка.Это обратное
quote_header_value().Журнал изменений
Изменено в версии 3.0: Параметр
is_filenameудалён.
-
werkzeug.http.dump_header(iterable) -
Создайте значение заголовка из списка элементов или пар
key=value, разделённых запятыми,.Это обратное преобразование
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"'- Параметры:
-
iterable (dict[str, Any] | Iterable[Any]) – Элементы для создания заголовка.
- Тип возвращаемого значения:
Журнал изменений
Изменено в версии 3.0: Параметр
allow_tokenудалён.Изменено в версии 2.2.3: Если ключ заканчивается на
*, его значение не будет заключено в кавычки.
Справочные материалы по условным ответам
Для условных ответов могут быть полезны следующие функции:
-
werkzeug.http.parse_etags(value) -
Разбор заголовка etag.
-
werkzeug.http.quote_etag(etag, weak=False) -
Котировка etag.
-
werkzeug.http.unquote_etag(etag: str) → tuple[str, bool] - werkzeug.http.unquote_etag(etag:None) tuple[None,None]
-
Раскрытие одного тега etag:
>>> unquote_etag('W/"bar"') ('bar', True) >>> unquote_etag('"bar"') ('bar', False)- Параметры:
-
etag – идентификатор тега etag для раскрытия.
- Возвращаемое значение:
-
кортеж
(etag, weak).
-
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, max_form_memory_size=None, max_content_length=None, cls=None, silent=True, *, max_form_parts=None) -
Этот класс реализует парсинг данных форм для Werkzeug. Он может парсить multipart и url-кодированные данные форм. Его можно наследовать и расширять, но для большинства 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[str, t.Any]] | None) – необязательный класс словаря для использования. Если это не указано или
None, используется по умолчаниюMultiDict. - silent (bool) – Если установлено в False, ошибки парсинга не будут перехвачены.
-
max_form_parts (int | None) – Максимальное количество частей multipart для парсинга. Если это значение превышено, генерируется исключение
RequestEntityTooLarge.
-
stream_factory (TStreamFactory | None) – Необязательное вызываемое значение, которое возвращает новый потоковый файл для чтения и записи. Это вызываемое значение работает так же, как
Изменения
Изменено в версии 3.0: Параметры
charsetиerrorsбыли удалены.Изменено в версии 3.0: Атрибут
parse_functionsи методыget_parse_funcбыли удалены.Изменено в версии 2.2.3: Добавлен параметр
max_form_parts.Добавлен в версии 0.8.
-
werkzeug.formparser.parse_form_data(environ, stream_factory=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[str, t.Any]] | None) – необязательный класс словаря для использования. Если это не указано или
None, используется по умолчаниюMultiDict. - silent (bool) – Если установлено в False, ошибки парсинга не будут перехвачены.
-
max_form_parts (int | None) – Максимальное количество частей multipart для парсинга. Если это значение превышено, генерируется исключение
RequestEntityTooLarge.
- Возвращает:
-
Кортеж в формате
(stream, form, files). - Тип возвращаемого значения:
-
t_parse_result
Изменения
Изменено в версии 3.0: Параметры
charsetиerrorsбыли удалены.Изменено в версии 2.3: Добавлен параметр
max_form_parts.Добавлен в версии 0.5.1: Добавлен параметр
silent.Добавлен в версии 0.5: Добавлены параметры
max_form_memory_size,max_content_length, иcls.
© 2007 Pallets
Licensed under the BSD 3-clause License.
https://werkzeug.palletsprojects.com/en/latest/http/