Утилиты 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]) – Строка с поддерживаемым форматом даты.
- Тип возвращаемого значения
-
Необязательное[datetime.datetime]
Изменено в версии 2.0: Возвращает объект datetime с учетом часового пояса. Используйте
email.utils.parsedate_to_datetime.
-
werkzeug.http.http_date(timestamp=None) Форматирует объект datetime или метку времени в строку даты в формате RFC 2822.
Это обёртка над
email.utils.format_datetime(). Она предполагает, что объекты datetime без часового пояса находятся в UTC вместо возбуждения исключения.- Параметры
-
timestamp (Необязательное[Union[datetime.datetime, datetime.date, int, float, time.struct_time]]) – Объект datetime или метка времени для форматирования. По умолчанию используется текущее время.
- Тип возвращаемого значения
Изменено в версии 2.0: Используйте
email.utils.format_datetime. Принимайте объектыdate.
-
werkzeug.http.cookie_date(expires=None) Форматирует объект datetime или метку времени в строку даты в формате RFC 2822 для
Set-Cookie expires.Устарело начиная с версии 2.0: Будет удалено в Werkzeug 2.1. Используйте
http_date()вместо этого.- Параметры
-
expires (Необязательное[Union[datetime.datetime, datetime.date, int, float, time.struct_time]]) –
- Тип возвращаемого значения
Парсинг заголовков
Следующие функции могут быть использованы для парсинга входящих заголовков HTTP. Поскольку Python не предоставляет структуры данных с семантикой, необходимой для RFC 2616, Werkzeug реализует некоторые пользовательские структуры данных, которые документированы отдельно.
-
werkzeug.http.parse_options_header(value, multiple=False) -
Разбирает заголовок типа
Content-Typeв кортеж со значением типа содержимого и опциями:>>> parse_options_header('text/html; charset=utf8') ('text/html', {'charset': 'utf8'})Не следует использовать для разбора заголовков типа
Cache-Control, которые используют немного другой формат. Для таких заголовков используйте функциюparse_dict_header().Журнал изменений
Изменено в версии 0.15: Обрабатываются продолжения параметров RFC 2231.
Добавлена в версии 0.5.
- Параметры
- Возвращает
-
(mimetype, options) или (mimetype, options, mimetype, options, …) если multiple=True
- Тип возвращаемого значения
-
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().- Параметры
-
- value (Необязательно[str]) – заголовок типа «множество» для разбора.
-
on_update (Необязательно[Callable[[werkzeug.datastructures.HeaderSet], None]]) – необязательная функция, вызываемая каждый раз, когда значение объекта
HeaderSetизменяется.
- Возвращает
-
объект
HeaderSet - Тип возвращаемого значения
-
werkzeug.http.parse_list_header(value) -
Разбирает списки, как описано в RFC 2068, раздел 2.
В частности, разбирает списки, разделенные запятыми, где элементы списка могут содержать строки в кавычках. Строка в кавычках может содержать запятую. Строка без кавычек может содержать кавычки внутри. Кавычки удаляются автоматически после разбора.
В основном работает так же, как
parse_set_header(), только элементы могут встречаться несколько раз, и сохраняется чувствительность к регистру.Значение возврата — стандартный
list:>>> parse_list_header('token, "quoted value"') ['token', 'quoted value']Чтобы снова создать заголовок из
list, используйте функциюdump_header().
-
werkzeug.http.parse_dict_header(value, cls=<class 'dict'>) -
Разбирает списки пар ключ-значение, как описано в RFC 2068, раздел 2, и преобразует их в словарь Python (или любой другой объект отображения, созданный из типа с интерфейсом, подобным словарю, предоставленным аргументом
cls):>>> d = parse_dict_header('foo="is a fish", bar="as well"') >>> type(d) is dict True >>> sorted(d.items()) [('bar', 'as well'), ('foo', 'is a fish')]Если для ключа нет значения, оно будет
None:>>> parse_dict_header('key_without_value') {'key_without_value': None}Чтобы снова создать заголовок из
dict, используйте функциюdump_header().Журнал изменений
Изменено в версии 0.9: Добавлена поддержка аргумента
cls.
-
werkzeug.http.parse_accept_header(value[, class]) -
Парсит заголовок HTTP Accept-*. Эта реализация не реализует полную валидную алгоритмическую схему, а только ту, которая поддерживает, как минимум, извлечение значений и качества.
Возвращает новый объект
Accept(по сути, список кортежей(value, quality), отсортированных по качеству, с дополнительными методами доступа).Второй параметр может быть подклассом
Accept, созданным с помощью обработанных значений и возвращенным.- Параметры
-
- value (Необязательно[str]) – строка заголовка accept для разбора.
-
cls (Необязательно[Type[werkzeug.http._TAnyAccept]]) – класс оболочки для значения возврата (может быть
Acceptили его подкласс)
- Возвращает
-
экземпляр
cls. - Тип возвращаемого значения
-
werkzeug.http._TAnyAccept
-
werkzeug.http.parse_cache_control_header(value, on_update=None, cls=None) -
Разбор заголовка управления кэшем. RFC различает кэширование ответов и запросов, этот метод — нет. Вам необходимо убедиться, что вы используете правильные операторы управления.
Журнал изменений
Новое в версии 0.5: Добавлена
cls. Если не указано, возвращается неизменяемыйRequestCacheControl.- Параметры
-
- value (Необязательно[str]) – заголовок управления кэшем для разбора.
-
on_update (Необязательно[Callable[[werkzeug.http._TAnyCC], None]]) – необязательная функция, вызываемая каждый раз при изменении значения в объекте
CacheControl. -
cls (Необязательно[Type[werkzeug.http._TAnyCC]]) – класс для возвращаемого объекта. По умолчанию используется
RequestCacheControl.
- Возвращает
-
объект
cls. - Тип возвращаемого значения
-
werkzeug.http._TAnyCC
-
werkzeug.http.parse_authorization_header(value) -
Разбор HTTP-заголовка авторизации basic/digest, переданного веб-браузером. Возвращаемое значение —
Noneв случае некорректного или отсутствующего заголовка, в противном случае — объектAuthorization.- Параметры
-
value (Необязательно[str]) – заголовок авторизации для разбора.
- Возвращает
-
объект
AuthorizationилиNone. - Тип возвращаемого значения
-
Optional[werkzeug.datastructures.Authorization]
-
werkzeug.http.parse_www_authenticate_header(value, on_update=None) -
Разбор заголовка HTTP WWW-Authenticate в объект
WWWAuthenticate.- Параметры
-
- value (Необязательно[str]) – заголовок WWW-Authenticate для разбора.
-
on_update (Необязательно[Callable[[werkzeug.datastructures.WWWAuthenticate], None]]) – необязательная функция, вызываемая при каждом изменении значения в объекте
WWWAuthenticate.
- Возвращает
-
объект
WWWAuthenticate. - Тип возвращаемого значения
-
werkzeug.http.parse_if_range_header(value) -
Разбирает заголовок if-range, который может быть значением etag или датой. Возвращает объект
IfRange.Изменено в версии 2.0: Если значение представляет собой дату, оно является часовым поясом.
Журнал изменений
Новое в версии 0.7.
- Параметры
-
value (Необязательно[str]) –
- Тип возвращаемого значения
-
werkzeug.http.parse_range_header(value, make_inclusive=True) -
Разбирает заголовок range в объект
Range. Если заголовок отсутствует или имеет неправильный формат, возвращаетсяNone.ranges— список(start, stop)кортежей, где диапазоны не включают конечные значения.Журнал изменений
Новое в версии 0.7.
- Параметры
- Тип возвращаемого значения
-
Optional[werkzeug.datastructures.Range]
-
werkzeug.http.parse_content_range_header(value, on_update=None) -
Разбирает заголовок диапазона в объект
ContentRangeилиNoneв случае невозможности разбора.Журнал изменений
Новое в версии 0.7.
- Параметры
-
- value (Необязательно[str]) – заголовок диапазона содержимого для разбора.
-
on_update (Необязательно[Callable[[werkzeug.datastructures.ContentRange], None]]) – необязательная функция, вызываемая при каждом изменении значения в объекте
ContentRange.
- Тип возвращаемого значения
-
Optional[werkzeug.datastructures.ContentRange]
Утилиты для заголовков
Следующие утилиты работают с 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заголовки по умолчанию не удаляются. Причина в этом — раздел 10.3.5 RFC 2616, который определяет некоторые заголовки сущности, которые должны быть отправлены.Журнал изменений
Изменено в версии 0.5: добавлена
allowedпараметр.- Параметры
-
-
headers (Union[werkzeug.datastructures.Headers, List[Tuple[str, str]]]) – список или
Headersобъект. - allowed (Iterable[str]) – список заголовков, которые всё равно должны быть разрешены, даже если они являются заголовками сущности.
-
headers (Union[werkzeug.datastructures.Headers, List[Tuple[str, str]]]) – список или
- Тип возвращаемого значения
-
werkzeug.http.remove_hop_by_hop_headers(headers) -
Удаление всех HTTP/1.1 заголовков «Hop-by-Hop» из списка или
Headersобъекта. Данная операция работает на месте.Журнал изменений
Новая в версии 0.5.
- Параметры
-
headers (Union[werkzeug.datastructures.Headers, List[Tuple[str, str]]]) – список или
Headersобъект. - Тип возвращаемого значения
-
werkzeug.http.is_byte_range_valid(start, stop, length) -
Проверка, является ли заданный диапазон байтов допустимым для заданной длины.
Журнал изменений
Новая в версии 0.7.
-
werkzeug.http.quote_header_value(value, extra_chars='', allow_token=True) -
При необходимости привести значение заголовка к кавычкам.
Журнал изменений
Новая в версии 0.5.
-
werkzeug.http.unquote_header_value(value, is_filename=False) -
Разбирает значение заголовка. (Обратное преобразование для
quote_header_value()). Это не использует реальное разбор заголовков, а то, что фактически используется браузерами для приведения к кавычкам.Журнал изменений
Новая в версии 0.5.
-
werkzeug.http.dump_header(iterable, allow_token=True) -
Вывести заголовок HTTP ещё раз. Это обратное преобразование
parse_list_header(),parse_set_header()иparse_dict_header(). Это также приводит к заключению в кавычки строк, содержащих знак равенства, если вы не передаёте его в виде словаря пар ключ-значение.>>> dump_header({'foo': 'bar baz'}) 'foo="bar baz"' >>> dump_header(('foo', 'bar baz')) 'foo, "bar baz"'- Параметры
- Тип возвращаемого значения
Справочные материалы по условным ответам
Для условных ответов могут быть полезны следующие функции:
-
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]) – etag ответа для сравнения.
-
данные (Необязательно[bytes]) – или, альтернативно, данные ответа для автоматического создания etag с помощью
generate_etag(). - last_modified (Необязательно[Union[datetime.datetime, str]]) – необязательная дата последнего изменения.
-
ignore_if_range (bool) – Если
False, заголовокIf-Rangeбудет учтён.
- Возвращает
-
Trueесли ресурс был изменён, в противном случаеFalse. - Тип возвращаемого значения
Изменено в версии 2.0: Для генерации значения etag для данных используется SHA-1. 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='utf-8', errors='replace', max_form_memory_size=None, max_content_length=None, cls=None, silent=True) -
Этот класс реализует парсинг данных формы для Werkzeug. Сам по себе он может парсить multipart и url-кодированные данные формы. Его можно наследовать и расширять, но для большинства MIME-типов лучше использовать необработанный поток и экспонировать его как отдельные атрибуты в объекте запроса.
Журнал изменений
В версии 0.8.
- Параметры
-
-
stream_factory (Необязательно[TStreamFactory]) – Необязательное вызываемое значение, которое возвращает новый открытый для чтения и записи дескриптор файла. Это вызываемое значение работает так же, как
Response._get_file_stream(). - charset (str) – Набор символов для данных формы URL и url-кодированных данных формы.
- errors (str) – Поведение обработки ошибок кодирования.
-
max_form_memory_size (Необязательно[int]) – максимальное количество байтов, принимаемых для данных формы, хранящихся в памяти. Если данные превышают указанное значение, возникает исключение
RequestEntityTooLarge. -
max_content_length (Необязательно[int]) – Если это значение указано, и передаваемые данные длиннее этого значения, возникает исключение
RequestEntityTooLarge. -
cls (Необязательно[Type[werkzeug.datastructures.MultiDict]]) – необязательный класс словаря для использования. Если это не указано или
Noneиспользуется по умолчаниюMultiDict. - silent (bool) – Если установлено в False, ошибки парсинга не будут перехватываться.
-
stream_factory (Необязательно[TStreamFactory]) – Необязательное вызываемое значение, которое возвращает новый открытый для чтения и записи дескриптор файла. Это вызываемое значение работает так же, как
- Тип возвращаемого значения
-
werkzeug.formparser.parse_form_data(environ, stream_factory=None, charset='utf-8', errors='replace', max_form_memory_size=None, max_content_length=None, cls=None, silent=True) -
Разбирает данные формы в среде environ и возвращает их как кортеж в виде
(stream, form, files). Вы должны вызывать этот метод только если метод транспортаPOST,PUT, илиPATCH.Если MIME-тип передаваемых данных
multipart/form-data, многозначный словарь файлов будет заполнен объектамиFileStorage. Если MIME-тип неизвестен, входной поток оборачивается и возвращается в качестве первого аргумента, иначе поток пуст.Это сокращение для общего использования
FormDataParser.Для получения более подробной информации см. Обработка данных запроса.
Журнал изменений
В версии 0.5.1: Добавлен необязательный флаг
silent.В версии 0.5: Добавлены параметры
max_form_memory_size,max_content_lengthиcls.- Параметры
-
- environ (WSGIEnvironment) – WSGI-среда, используемая для парсинга.
-
stream_factory (Необязательно[TStreamFactory]) – Необязательное вызываемое значение, которое возвращает новый открытый для чтения и записи дескриптор файла. Это вызываемое значение работает так же, как
Response._get_file_stream(). - charset (str) – Набор символов для данных формы URL и url-кодированных данных формы.
- errors (str) – Поведение обработки ошибок кодирования.
-
max_form_memory_size (Необязательно[int]) – максимальное количество байтов, принимаемых для данных формы, хранящихся в памяти. Если данные превышают указанное значение, возникает исключение
RequestEntityTooLarge. -
max_content_length (Необязательно[int]) – Если это значение указано, и передаваемые данные длиннее этого значения, возникает исключение
RequestEntityTooLarge. -
cls (Необязательно[Type[werkzeug.datastructures.MultiDict]]) – необязательный класс словаря для использования. Если это не указано или
Noneиспользуется по умолчаниюMultiDict. - silent (bool) – Если установлено в False, ошибки парсинга не будут перехватываться.
- Возвращает
-
Кортеж в форме
(stream, form, files). - Тип возвращаемого значения
-
t_parse_result
© 2007–2021 Pallets
Licensed under the BSD 3-clause License.
https://werkzeug.palletsprojects.com/en/2.0.x/http/