http.cookies — Управление состоянием HTTP

Источник: Lib/http/cookies.py


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

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

Набор символов, string.ascii_letters, string.digits и !#$%&'*+-.^_`|~: denote the set of valid characters allowed by this module in a cookie name (as 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(). SimpleCookie поддерживает строки в качестве значений cookie. При установке значения SimpleCookie вызывает встроенный str() для преобразования значения в строку. Значения, полученные по HTTP, сохраняются в виде строк.

См.также

Модуль http.cookiejar

Обработка HTTP-куки для веб-клиентов. Модули http.cookiejar и http.cookies не зависят друг от друга.

RFC 2109 - Механизм управления состоянием HTTP

Это спецификация управления состоянием, реализуемая данным модулем.

Объекты морса

class http.cookies.Morsel

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

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

expires
path
comment
domain
max-age
secure
version
httponly
samesite

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

Атрибут samesite указывает, что браузеру запрещено отправлять cookie вместе с межсайтовыми запросами. Это помогает предотвратить атаки CSRF. Допустимые значения для этого атрибута - «Strict» и «Lax».

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

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

Изменено в версии 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.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)

Возвращает строку, представляющую морс, без окружающего HTTP или JavaScript.

Значение для attrs такое же, как и в output().

Morsel.update(values)

Обновите значения в словаре Morsel значениями в словаре values. Вызовите ошибку, если какой-либо из ключей в словаре values не является допустимым атрибутом RFC 2109.

Изменено в версии 3.5: при недействительных ключах возникает ошибка.

Morsel.copy(value)

Возвращает неглубокую копию объекта Morsel.

Изменено в версии 3.5: возвращает объект Morsel вместо dict.

Morsel.setdefault(key, value=None)

Вызывает ошибку, если ключ не является допустимым атрибутом RFC 2109, в противном случае ведет себя так же, как и dict.setdefault().

Пример

В следующем примере показано, как использовать модуль http.cookies.

>>> from http import cookies
>>> C = cookies.SimpleCookie()
>>> C["fig"] = "newton"
>>> C["sugar"] = "wafer"
>>> print(C) # generate HTTP headers
Set-Cookie: fig=newton
Set-Cookie: sugar=wafer
>>> print(C.output()) # same thing
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") # load from a string (HTTP header)
>>> 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