Утилиты 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 (Optional[str]) – Строка с поддерживаемым форматом даты.
- Тип возвращаемого значения:
Изменения
Изменено в версии 2.0: Возвращает объект datetime с учетом часового пояса. Используйте
email.utils.parsedate_to_datetime.
-
werkzeug.http.http_date(timestamp=None) -
Форматирует объект datetime или метку времени в строку даты в формате RFC 2822.
Это обертка для
email.utils.format_datetime(). Она предполагает, что объекты datetime без часового пояса находятся в UTC, вместо выброса исключения.- Параметры:
-
timestamp (Optional[Union[datetime, date, int, float, struct_time]]) – Объект datetime или метка времени для форматирования. По умолчанию используется текущее время.
- Тип возвращаемого значения:
Изменения
Изменено в версии 2.0: Используйте
email.utils.format_datetime. Принимает объектыdate.
Разбор заголовков
Следующие функции могут быть использованы для разбора входящих заголовков HTTP. Поскольку Python не предоставляет структуры данных с семантикой, необходимой RFC 2616, Werkzeug реализует некоторые пользовательские структуры данных, которые документированы отдельно.
-
werkzeug.http.parse_options_header(value) -
Разбор заголовка типа
Content-Typeв кортеж со значением и опциями:>>> parse_options_header('text/html; charset=utf8') ('text/html', {'charset': 'utf8'})Эта функция не предназначена для заголовков типа
Cache-Control, которые используют другой формат. Для них используйтеparse_dict_header().- Параметры:
- Тип возвращаемого значения:
Изменено в версии 2.2: Имена опций всегда преобразуются в нижний регистр.
Изменения
Изменено в версии 2.1: Параметр
multipleустарел и будет удален в Werkzeug 2.2.Изменено в версии 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().- Параметры:
- Возвращаемое значение:
-
объект
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, созданным с помощью проанализированных значений и возвращённым.
-
werkzeug.http.parse_cache_control_header(value, on_update=None, cls=None) -
Обрабатывает заголовок управления кэшем. RFC отличается для кэша ответа и запроса, этот метод не различает. Вам необходимо следить за правильностью использования инструкций.
Changelog
Добавлен в версии 0.5: Добавлен
cls. Если не указано, возвращается неизменяемыйRequestCacheControl.- Parameters:
-
- value (Optional[str]) – заголовок управления кэшем для обработки.
-
on_update (Optional[Callable[[_TAnyCC], None]]) – необязательное вызываемое значение, которое вызывается каждый раз, когда изменяется значение в объекте
CacheControl. -
cls (Optional[Type[_TAnyCC]]) – класс для возвращаемого объекта. По умолчанию используется
RequestCacheControl.
- Returns:
-
объект
cls. - Return type:
-
_TAnyCC
-
werkzeug.http.parse_authorization_header(value) -
Обрабатывает заголовок HTTP basic/digest аутентификации, переданный веб-браузером. Возвращаемое значение —
None, если заголовок недействителен или не задан, в противном случае объектAuthorization.- Parameters:
-
value (Optional[str]) – обрабатываемый заголовок аутентификации.
- Returns:
-
объект
AuthorizationилиNone. - Return type:
-
werkzeug.http.parse_www_authenticate_header(value, on_update=None) -
Обрабатывает заголовок HTTP WWW-Authenticate в объект
WWWAuthenticate.- Parameters:
-
- value (Optional[str]) – обрабатываемый заголовок WWW-Authenticate.
-
on_update (Optional[Callable[[WWWAuthenticate], None]]) – необязательное вызываемое значение, которое вызывается каждый раз, когда изменяется значение в объекте
WWWAuthenticate.
- Returns:
-
объект
WWWAuthenticate. - Return type:
-
werkzeug.http.parse_if_range_header(value) -
Обрабатывает заголовок if-range, который может быть значением ETag или даты. Возвращает объект
IfRange.Changelog
Изменено в версии 2.0: Если значение представляет дату, оно является часовым поясом.
Добавлен в версии 0.7.
-
werkzeug.http.parse_range_header(value, make_inclusive=True) -
Обрабатывает заголовок range в объект
Range. Если заголовок отсутствует или некорректен, возвращаетсяNone.ranges— список(start, stop)кортежей, где диапазоны не включают границы.Changelog
Добавлен в версии 0.7.
-
werkzeug.http.parse_content_range_header(value, on_update=None) -
Разбирает заголовок диапазона в объект
ContentRangeилиNone, если разбор невозможен.Журнал изменений
Введено в версии 0.7.
- Параметры:
-
- значение (Optional[str]) – заголовок диапазона содержимого для разбора.
-
on_update (Optional[Callable[[ContentRange], None]]) – необязательная функция, которая вызывается каждый раз, когда изменяется значение в объекте
ContentRange.
- Тип возвращаемого значения:
Утилиты заголовков
Следующие утилиты хорошо работают с 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='', 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 (Optional[str]) – etag ответа для сравнения.
-
data (Optional[bytes]) – или, как альтернатива, данные ответа для автоматической генерации etag с помощью
generate_etag(). - last_modified (Optional[Union[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-encoded. Его можно наследовать и расширять, но для большинства типов MIME лучше использовать исходный поток и экспонировать его как отдельные атрибуты в объекте запроса.
Изменения
Введено в версии 0.8.
- Параметры:
-
-
stream_factory (Optional[TStreamFactory]) – Необязательная функция, возвращающая новый читаемый и записываемый дескриптор файла. Эта функция работает так же, как
Response._get_file_stream(). - charset (str) – Кодировка символов для данных формы URL и url-encoded.
- errors (str) – Обработка ошибок кодирования.
-
max_form_memory_size (Optional[int]) – максимальное количество байтов, принимаемых для данных формы в памяти. Если данные превышают указанное значение, возникает исключение
RequestEntityTooLarge. -
max_content_length (Optional[int]) – Если это значение задано и передаваемые данные длиннее этого значения, возникает исключение
RequestEntityTooLarge. -
cls (Optional[Type[MultiDict]]) – необязательный класс словаря. Если это не указано или
None, используется по умолчаниюMultiDict. - silent (bool) – Если установлено в False, ошибки парсинга не будут перехватываться.
-
stream_factory (Optional[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 (Optional[TStreamFactory]) – Необязательная функция, возвращающая новый читаемый и записываемый дескриптор файла. Эта функция работает так же, как
Response._get_file_stream(). - charset (str) – Кодировка символов для данных формы URL и url-encoded.
- errors (str) – Обработка ошибок кодирования.
-
max_form_memory_size (Optional[int]) – максимальное количество байтов, принимаемых для данных формы в памяти. Если данные превышают указанное значение, возникает исключение
RequestEntityTooLarge. -
max_content_length (Optional[int]) – Если это значение задано и передаваемые данные длиннее этого значения, возникает исключение
RequestEntityTooLarge. -
cls (Optional[Type[MultiDict]]) – необязательный класс словаря. Если это не указано или
None, используется по умолчаниюMultiDict. - silent (bool) – Если установлено в False, ошибки парсинга не будут перехватываться.
- Возвращаемое значение:
-
Кортеж в формате
(stream, form, files). - Тип возвращаемого значения:
-
t_parse_result
© 2007–2022 Pallets
Licensed under the BSD 3-clause License.
https://werkzeug.palletsprojects.com/en/2.2.x/http/