Содержание страницы
21.23. http.cookies – управление состоянием HTTP¶http.cookies – HTTP state management
Исходный код: Lib/http/cookies.py
Модуль 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() как тождественную функцию и str() соответственно.
См. также
- Модуль http.cookiejar
- Обработка HTTP cookie для веб-клиентов. Модули http.cookiejar и http.cookies не зависят друг от друга.
- RFC 2109 – Механизм управления состоянием HTTP
- Это спецификация управления состоянием, реализованная этим модулем.
21.23.1. Объекты Cookie¶Cookie Objects
Возвращает декодированное значение из строкового представления. Возвращаемое значение может быть любого типа. Этот метод ничего не делает в BaseCookie – он существует для того, чтобы его можно было переопределить.
Возвращает закодированное значение. val может быть любого типа, но возвращаемое значение должно быть строкой. Этот метод ничего не делает в BaseCookie – он существует, чтобы его можно было переопределить
В общем случае предполагается, что value_encode() и value_decode() являются обратными функциями на области значений value_decode.
Возвращает строковое представление, пригодное для отправки в качестве HTTP-заголовков. attrs и header передаются методу output() каждого объекта Morsel. sep используется для объединения заголовков; по умолчанию это комбинация '\r\n' (CRLF).
Возвращает встраиваемый фрагмент JavaScript, который при выполнении в браузере, поддерживающем JavaScript, будет действовать так же, как если бы были отправлены HTTP-заголовки.
Значение attrs такое же, как в output().
Если rawdata является строкой, она разбирается как HTTP_COOKIE, а найденные значения добавляются как объекты Morsel. Если это словарь, то эквивалентно следующему:
for k, v in rawdata.items(): cookie[k] = v
21.23.2. Объекты Morsel¶Morsel Objects
Абстрагирует пару ключ/значение с атрибутами RFC 2109.
Объекты Morsel похожи на словари, и их набор ключей постоянен: это допустимые атрибуты RFC 2109, которые
- expires
- path
- comment
- domain
- max-age
- secure
- version
- httponly
Атрибут httponly указывает, что cookie передаётся только в HTTP-запросах и недоступна через JavaScript. Это предназначено для смягчения некоторых форм межсайтового скриптинга.
Ключи нечувствительны к регистру.
Значение cookie.
Закодированное значение cookie – именно его следует отправлять.
Имя cookie.
Устанавливает атрибуты key, value и coded_value.
Определяет, является ли K одним из ключей объекта Morsel.
Возвращает строковое представление объекта Morsel, подходящее для отправки в качестве HTTP-заголовка. По умолчанию включаются все атрибуты, если не указан attrs; в этом случае он должен быть списком используемых атрибутов. header по умолчанию равен "Set-Cookie:".
Возвращает встраиваемый фрагмент JavaScript, который при выполнении в браузере, поддерживающем JavaScript, будет действовать так же, как если бы был отправлен HTTP-заголовок.
Значение attrs такое же, как в output().
Возвращает строку, представляющую Morsel, без какого-либо окружающего HTTP или JavaScript.
Значение attrs такое же, как в output().
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