http.cookies
— Управление состоянием HTTP
Модуль http.cookies
определяет классы для абстрагирования концепции
cookie, механизма управления состоянием HTTP. Он поддерживает как простые
строковые cookie, так и предоставляет абстракцию для использования любого
сериализуемого типа данных в качестве значения cookie.
Ранее модуль строго применял правила синтаксического анализа, описанные в спецификациях RFC 2109 и RFC 2068. С тех пор было обнаружено, что MSIE 3.0x не следует правилам символов, изложенным в данных спецификациях, а также многие современные браузеры и серверы имеют ослабленные правила синтаксического анализа, когда дело доходит до обработки cookie. В результате используемые правила синтаксического анализа немного менее строги.
Множество символов string.ascii_letters
, string.digits
и
!#$%&'*+-.^_`|~:
обозначает множество допустимых символов, разрешенных этим
модулем в имени файла cookie (как key
).
Изменено в версии 3.3: Допускается «:» в качестве допустимого символа имени файла cookie.
Примечание
При обнаружении недействительного файла cookie возникает CookieError
,
поэтому, если ваши данные cookie поступают из браузера, вы всегда должны
подготовиться к недопустимым данным и поймать CookieError
при
парсинге.
Ошибка исключения из-за недействительности RFC 2109: неверные атрибуты, неправильный заголовок Set-Cookie и т. д.
Данный класс — подобный словарю объект, ключи которого являются строками, а значения — экземплярами
Morsel
. Обратите внимание, что при установке значения ключа значение сначала преобразуется вMorsel
, содержащее ключ и значение.Если задан input, он передаётся методу
load()
.
Данный класс является производным от
BaseCookie
и имеет приоритет надvalue_decode()
иvalue_encode()
. SimpleCookie поддерживает строки как значения cookie. При установке значения SimpleCookie вызывает встроенныйstr()
для преобразования значения в строку. Значения, полученные от HTTP, хранятся в виде строк.
См.также
- Модуль
http.cookiejar
- Обработка cookie HTTP для клиентов Интернета.
http.cookiejar
и Модулиhttp.cookies
не зависят друг от друга. - RFC 2109 — механизм управления состоянием HTTP
- Это спецификация управления состоянием, реализованная этим модулем.
Объекты cookie
Возвращает кортеж
(real_value, coded_value)
из строкового представления.real_value
может быть любого типа. Данный метод не декодирует вBaseCookie
, — он существует, поэтому его можно переопределить.
Возвращает кортеж
(real_value, coded_value)
. val может быть любого типа, ноcoded_value
всегда будет преобразован в строку. Данный метод не кодирует вBaseCookie
, — он существует, поэтому его можно переопределить.В общем, должно быть так, что
value_encode()
иvalue_decode()
являются обратными в диапазоне value_decode.
Возвращает строковое представление, подходящее для отправки в виде заголовков HTTP. attrs и header отправляются каждому методу
Morsel
output()
. sep используется для объединения заголовков и по умолчанию представляет собой комбинацию'\r\n'
(CRLF).
Возвращает встраиваемый фрагмент кода JavaScript, который при запуске в браузере, поддерживающем JavaScript, будет работать так же, как если бы были отправлены HTTP заголовки.
Значение attrs такое же, как в
output()
.
Если rawdata является строкой, распарсить её как
HTTP_COOKIE
и добавить найденные там значения какMorsel
ы. Если это словарь, он эквивалентен:for k, v in rawdata.items(): cookie[k] = v
Объекты Морселя
Абстрагировать пару ключ/значение, у которой есть некоторые атрибуты RFC 2109.
Морсели — это подобные словарю объекты, множество ключей которых является постоянным — действительными атрибутами RFC 2109. Вот их перечень:
expires
path
comment
domain
max-age
secure
version
httponly
samesite
Атрибут
httponly
указывает, что cookie передаётся только в HTTP- запросах и недоступен через JavaScript. Это предназначено для смягчения некоторых форм межсайтового скриптинга.Атрибут
samesite
указывает, что браузеру не разрешено отправлять cookie вместе с межсайтовыми запросами. Это помогает смягчить CSRF-атаки. Допустимые значения этого атрибута: «Strict» и «Lax».Ключи не чувствительны к регистру, и их значение по умолчанию —
''
.Изменено в версии 3.7: Атрибуты
key
,value
иcoded_value
доступны только для чтения. Для их настройки используйтеset()
.Изменено в версии 3.8: Добавлена поддержка атрибута
samesite
.
Значение cookie.
Закодированное значение файла cookie — это то, что нужно отправить.
Название куки.
Устанавливает атрибуты key, value и coded_value.
Является ли K членом набора ключей
Morsel
.
Возвращает строковое представление Морселя, подходящее для отправки в качестве заголовка HTTP. По умолчанию включены все атрибуты, если не указан attrs, и в этом случае это должен быть список атрибутов для использования. header по умолчанию —
"Set-Cookie:"
.
Возвращает встраиваемый фрагмент кода JavaScript, который при запуске в браузере, поддерживающем JavaScript, будет действовать так же, как если бы был отправлен заголовок HTTP.
Значение attrs такое же, как в
output()
.
Возвращает представляющую Морсель строку, без каких-либо окружающих HTTP или JavaScript.
Значение attrs такое же, как в
output()
.
Обновляет значения в словаре Морселя значениями в словаре values. Вызвать ошибку, если какой-либо из ключей в dict values не является допустимым атрибутом RFC 2109.
Изменено в версии 3.5: Вызывается ошибка для недопустимых ключей.
Возвращает поверхностную копию Морсель объекта.
Изменено в версии 3.5: Возвращает объект Морсель вместо dict.
Вызывает ошибку, если ключ не является допустимым атрибутом RFC 2109, в противном случае ведёт себя так же, как
dict.setdefault()
.
Пример
В следующем примере показано, как использовать модуль http.cookies
.
>>> from http import cookies
>>> C = cookies.SimpleCookie()
>>> C["fig"] = "newton"
>>> C["sugar"] = "wafer"
>>> print(C) # генерировать заголовки HTTP
Set-Cookie: fig=newton
Set-Cookie: sugar=wafer
>>> print(C.output()) # то же самое
Set-Cookie: fig=newton
Set-Cookie: sugar=wafer
>>> C = cookies.SimpleCookie()
>>> C["rocky"] = "road"
>>> C["rocky"]["path"] = "/cookie"
>>> print(C.output(header="Cookie:"))
Cookie: rocky=road; Path=/cookie
>>> print(C.output(attrs=[], header="Cookie:"))
Cookie: rocky=road
>>> C = cookies.SimpleCookie()
>>> C.load("chips=ahoy; vienna=finger") # загрузить из строки (заголовок HTTP)
>>> print(C)
Set-Cookie: chips=ahoy
Set-Cookie: vienna=finger
>>> C = cookies.SimpleCookie()
>>> C.load('keebler="E=everybody; L=\\"Loves\\"; fudge=\\012;";')
>>> print(C)
Set-Cookie: keebler="E=everybody; L=\"Loves\"; fudge=\012;"
>>> C = cookies.SimpleCookie()
>>> C["oreo"] = "doublestuff"
>>> C["oreo"]["path"] = "/"
>>> print(C)
Set-Cookie: oreo=doublestuff; Path=/
>>> C = cookies.SimpleCookie()
>>> C["twix"] = "none for you"
>>> C["twix"].value
'none for you'
>>> C = cookies.SimpleCookie()
>>> C["number"] = 7 # equivalent to C["number"] = str(7)
>>> C["string"] = "seven"
>>> C["number"].value
'7'
>>> C["string"].value
'seven'
>>> print(C)
Set-Cookie: number=7
Set-Cookie: string=seven