Документация Python неофициальный перевод
Содержание страницы

21.23. http.cookies – Управление состоянием HTTPhttp.cookies – HTTP state management

Исходный код: Lib/http/cookies.py


Модуль http.cookies определяет классы для абстрагирования концепции куки – механизма управления состоянием HTTP. Он поддерживает как простые куки, состоящие только из строк, так и абстракцию для использования любого сериализуемого типа данных в качестве значения куки.

Раньше модуль строго применял правила разбора, описанные в спецификациях RFC 2109 и RFC 2068. Но с тех пор выяснилось, что MSIE 3.0x не соблюдает описанные в этих спецификациях правила набора символов, и к тому же многие современные браузеры и серверы при работе с Cookie придерживаются менее строгих правил разбора. В результате используемые правила разбора стали несколько менее строгими.

Набор символов string.ascii_letters, string.digits и !#$%&'*+-.^_`|~: обозначает множество допустимых символов, которые разрешены этим модулем в имени Cookie (как key).

Изменено в версии 3.3: Разрешён символ ‘:’ в качестве допустимого символа имени Cookie.

Примечание

При обнаружении недопустимой куки возбуждается исключение 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(), превращая их в identity и str() соответственно.

См. также

Модуль http.cookiejar
Обработка HTTP-куки для веб-клиентов. Модули http.cookiejar и http.cookies не зависят друг от друга.
RFC 2109 – Механизм управления состоянием HTTP
Это спецификация управления состоянием, реализованная этим модулем.

21.23.2. Объекты MorselMorsel Objects

class http.cookies.Morsel

Абстрагирует пару ключ/значение с атрибутами RFC 2109.

Объекты Morsel похожи на словари, и их набор ключей постоянен: это допустимые атрибуты RFC 2109, которые

  • expires
  • path
  • comment
  • domain
  • max-age
  • secure
  • version
  • httponly

Атрибут httponly указывает, что cookie передаётся только в HTTP-запросах и недоступен через JavaScript. Это предназначено для снижения риска некоторых форм межсайтового скриптинга.

Ключи нечувствительны к регистру, и их значение по умолчанию – ''.

Изменено в версии 3.5: __eq__() теперь учитывает key и value.

Morsel.value

Значение cookie.

Устарело с версии 3.5: присваивание value; используйте set().

Morsel.coded_value

Закодированное значение cookie – именно его следует отправлять.

Устарело с версии 3.5: присваивание coded_value; используйте set().

Morsel.key

Имя cookie.

Устарело с версии 3.5: присваивание key; используйте set().

Morsel.set(key, value, coded_value)

Устанавливает атрибуты key, value и coded_value.

Устарело с версии 3.5: недокументированный параметр LegalChars игнорируется и будет удалён в будущей версии.

Morsel.isReservedKey(K)

Проверяет, входит ли K в набор ключей Morsel.

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().

21.23.3. Пример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=\\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 # эквивалентно 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