Служебные утилиты 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.Изменения
Изменено в версии 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.datetime, datetime.date, int, float, time.struct_time]]) – Объект datetime или временная метка для форматирования. По умолчанию используется текущее время.
- Тип возвращаемого значения
Изменения
Изменено в версии 2.0: Используйте
email.utils.format_datetime. Принимает объектыdate.
Парсинг Заголовков
Следующие функции могут быть использованы для парсинга входящих HTTP заголовков. Поскольку Python не предоставляет структуры данных со семантикой, требуемой RFC 2616, Werkzeug реализует некоторые пользовательские структуры данных, которые документированы отдельно.
-
werkzeug.http.parse_options_header(value, multiple=None) -
Разбирает заголовок типа
Content-Typeв кортеж со значением и любыми опциями:>>> parse_options_header('text/html; charset=utf8') ('text/html', {'charset': 'utf8'})Это не предназначено для заголовков типа
Cache-Control, которые используют другой формат. Для них используйтеparse_dict_header().- Параметры
- Тип возвращаемого значения
Изменено в версии 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().- Параметры
- Возвращаемое значение
- Тип возвращаемого значения
-
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 различает заголовки управления кэшем для ответов и запросов, этот метод нет. Вам следует позаботиться о том, чтобы не использовать неправильные инструкции.
Журнал изменений
В версии 0.5: Добавлен
cls. Если не указано, возвращается неизменяемыйRequestCacheControl.- Параметры
-
- value (Optional[str]) – заголовок управления кэшем для разбора.
-
on_update (Optional[Callable[[werkzeug.http._TAnyCC], None]]) – необязаемый вызываемый объект, который вызывается каждый раз, когда изменяется значение в объекте
CacheControl. -
cls (Optional[Type[werkzeug.http._TAnyCC]]) – класс для возвращаемого объекта. По умолчанию используется
RequestCacheControl.
- Возвращает
-
объект
cls. - Тип возвращаемого значения
-
werkzeug.http._TAnyCC
-
werkzeug.http.parse_authorization_header(value) -
Разбор заголовка авторизации HTTP basic/digest, переданного веб-браузером. Возвращаемое значение —
None, если заголовок некорректен или отсутствует, в противном случае — объектAuthorization.- Параметры
- Возвращает
-
объект
AuthorizationилиNone. - Тип возвращаемого значения
-
werkzeug.http.parse_www_authenticate_header(value, on_update=None) -
Разбор заголовка HTTP WWW-Authenticate в объект
WWWAuthenticate.- Параметры
-
- value (Optional[str]) – заголовок WWW-Authenticate для разбора.
-
on_update (Optional[Callable[[werkzeug.datastructures.WWWAuthenticate], None]]) – необязаемый вызываемый объект, который вызывается каждый раз, когда изменяется значение в объекте
WWWAuthenticate.
- Возвращает
-
объект
WWWAuthenticate. - Тип возвращаемого значения
-
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 в объект
Range. Если заголовок отсутствует или имеет неправильный формат, возвращаетсяNone.rangesпредставляет собой список(start, stop)кортежей, где диапазоны не включают конечные значения.Журнал изменений
В версии 0.7.
- Параметры
- Тип возвращаемого значения
-
werkzeug.http.parse_content_range_header(value, on_update=None) -
Разбирает заголовок диапазона в объект
ContentRangeилиNoneесли разбор невозможен.Журнал изменений
В версии 0.7.
- Параметры
-
- value (Optional[str]) – заголовок диапазона содержимого для разбора.
-
on_update (Optional[Callable[[werkzeug.datastructures.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) -
Проверка, является ли заголовок заголовком 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, 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.
- Параметры
- Возвращает
-
объект
ETags. - Тип возвращаемого значения
-
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.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[werkzeug.datastructures.MultiDict]]) – необязательный класс словаря для использования. Если это не указано или
None, используется по умолчаниюMultiDict. - silent (bool) – Если установлено в False, ошибки разбора не будут перехвачены.
-
stream_factory (Optional[TStreamFactory]) – Необязательная функция, возвращающая новый доступный для чтения и записи дескриптор файла. Эта функция работает так же, как
- Тип возвращаемого значения
-
None
-
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[werkzeug.datastructures.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.1.x/http/