Содержание страницы
http.cookies – Управление состоянием HTTP¶http.cookies – HTTP state management
Исходный код: Lib/http/cookies.py
Модуль http.cookies определяет классы для абстрагирования концепции куки – механизма управления состоянием HTTP. Он поддерживает как простые куки, состоящие только из строк, так и абстракцию для использования любого сериализуемого типа данных в качестве значения куки.
Ранее модуль строго применял правила разбора, описанные в спецификациях RFC 2109 и RFC 2068. С тех пор было обнаружено, что MSIE 3.0x не следовал правилам символов, изложенным в этих спецификациях; многие современные браузеры и серверы также ослабили правила разбора при работе с куки. В результате этот модуль теперь использует правила разбора, которые стали несколько менее строгими, чем раньше.
Наборы символов string.ascii_letters, string.digits и !#$%&'*+-.^_`|~: обозначают множество допустимых символов, разрешённых этим модулем в имени куки (как key).
Изменено в версии 3.3: Разрешён символ ‘:’ в качестве допустимого символа в имени куки.
Примечание
При обнаружении недопустимой куки возбуждается исключение CookieError, поэтому, если данные куки поступают из браузера, всегда следует быть готовым к недопустимым данным и перехватывать CookieError при разборе.
- exception http.cookies.CookieError¶
Исключение, возникающее из-за недействительности RFC 2109: неверные атрибуты, неверный заголовок Set-Cookie и т.д.
- class http.cookies.BaseCookie([input])¶
Этот класс является объектом, подобным словарю, ключи которого – строки, а значения – экземпляры
Morsel. Обратите внимание, что при установке ключа в значение, это значение сначала преобразуется в объектMorsel, содержащий ключ и значение.Если передан параметр input, он передаётся методу
load().
- class http.cookies.SimpleCookie([input])¶
Этот класс происходит от
BaseCookieи переопределяетvalue_decode()иvalue_encode().SimpleCookieподдерживает строки в качестве значений куки. При установке значенияSimpleCookieвызывает встроенную функциюstr()для преобразования значения в строку. Значения, полученные из HTTP, сохраняются как строки.
См. также
- Модуль
http.cookiejar Обработка HTTP-куки для веб-клиентов. Модули
http.cookiejarиhttp.cookiesне зависят друг от друга.- RFC 2109 – Механизм управления состоянием HTTP
Это спецификация управления состоянием, реализованная этим модулем.
Объекты Cookie¶Cookie Objects
- BaseCookie.value_decode(val)¶
Возвращает кортеж
(real_value, coded_value)из строкового представления.real_valueможет быть любого типа. Этот метод не выполняет декодирование вBaseCookie– он существует, чтобы его можно было переопределить.
- BaseCookie.value_encode(val)¶
Возвращает кортеж
(real_value, coded_value). val может быть любого типа, ноcoded_valueвсегда будет преобразован в строку. Этот метод не выполняет кодирование вBaseCookie– он существует, чтобы его можно было переопределить.В общем случае должно выполняться условие, что
value_encode()иvalue_decode()являются взаимно обратными на области значений value_decode.
- BaseCookie.output(attrs=None, header='Set-Cookie:', sep='\r\n')¶
Возвращает строковое представление, пригодное для отправки в качестве HTTP-заголовков. attrs и header передаются каждому методу
output()объектаMorsel. sep используется для объединения заголовков, и по умолчанию имеет значение'\r\n'(CRLF).
Объекты Morsel¶Morsel Objects
- class http.cookies.Morsel¶
Абстрагирует пару ключ/значение с атрибутами RFC 2109.
Объекты Morsel похожи на словари, их набор ключей постоянен – это атрибуты RFC 2109, а именно:
Атрибут
httponlyуказывает, что cookie передаётся только в HTTP-запросах и недоступен через JavaScript. Это предназначено для снижения риска некоторых форм межсайтового скриптинга.Атрибут
samesiteуказывает, что браузеру не разрешается отправлять cookie вместе с межсайтовыми запросами. Это помогает снизить риск CSRF-атак. Допустимые значения этого атрибута – “Strict” и “Lax”.Ключи нечувствительны к регистру, и их значение по умолчанию –
''.Изменено в версии 3.7: Атрибуты
key,valueиcoded_valueтеперь доступны только для чтения. Для их установки используйтеset().Изменено в версии 3.8: Добавлена поддержка атрибута
samesite.
- Morsel.value¶
Значение cookie.
- Morsel.coded_value¶
Закодированное значение cookie – именно его следует отправлять.
- Morsel.key¶
Имя cookie.
- Morsel.set(key, value, coded_value)¶
Устанавливает атрибуты key, value и coded_value.
- Morsel.output(attrs=None, header='Set-Cookie:')¶
Возвращает строковое представление Morsel, пригодное для отправки в качестве HTTP-заголовка. По умолчанию включаются все атрибуты, если не указан attrs – в этом случае это должен быть список используемых атрибутов. header по умолчанию равен
"Set-Cookie:".
- Morsel.js_output(attrs=None)¶
Возвращает встраиваемый фрагмент JavaScript, который при выполнении в браузере, поддерживающем JavaScript, будет действовать так же, как если бы был отправлен HTTP-заголовок.
Значение attrs такое же, как в
output().
- Morsel.OutputString(attrs=None)¶
Возвращает строку, представляющую Morsel, без какого-либо окружающего HTTP или JavaScript.
Значение attrs такое же, как в
output().
- Morsel.update(values)¶
Обновляет значения в словаре Morsel значениями из словаря values. Вызывает ошибку, если какой-либо из ключей в словаре values не является допустимым атрибутом RFC 2109.
Изменено в версии 3.5: возникает ошибка для недопустимых ключей.
- Morsel.copy(value)¶
Возвращает поверхностную копию объекта Morsel.
Изменено в версии 3.5: возвращает объект Morsel вместо словаря.
- Morsel.setdefault(key, value=None)¶
Вызывает ошибку, если ключ не является допустимым атрибутом RFC 2109, в противном случае ведёт себя так же, как
dict.setdefault().
Пример¶Example
Следующий пример демонстрирует, как использовать модуль 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=;";')
>>> print(C)
Set-Cookie: keebler="E=everybody; L=\"Loves\"; fudge=;"
>>> 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 # эквивалентно 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