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

cookie.md

229 строк · 16.0 КБ · обычная страница · сырой текст · скачать

1> **Источник:** https://python-all.ru/2.7/library/cookie.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 20.22. [`Cookie`](https://python-all.ru/2.7/library/cookie.html#module-Cookie) – управление состоянием HTTP89> **Примечание**10>11> Модуль [`Cookie`](https://python-all.ru/2.7/library/cookie.html#module-Cookie) переименован в `http.cookies` в Python 3. Инструмент [2to3](https://python-all.ru/2.7/glossary.html#term-2to3) автоматически адаптирует импорты при преобразовании исходных кодов в Python 3.1213**Исходный код:** [Lib/Cookie.py](https://python-all.ru/src/2.7/Lib/Cookie.py)1415---1617Модуль [`Cookie`](https://python-all.ru/2.7/library/cookie.html#module-Cookie) определяет классы для абстрагирования концепции куки – механизма управления состоянием HTTP. Он поддерживает как простые куки, состоящие только из строк, так и абстракцию для использования любого сериализуемого типа данных в качестве значения куки.1819Раньше модуль строго применял правила разбора, описанные в спецификациях [**RFC 2109**](https://python-all.ru/2.7/library/cookie.html) и [**RFC 2068**](https://python-all.ru/2.7/library/cookie.html). Но с тех пор выяснилось, что MSIE 3.0x не соблюдает описанные в этих спецификациях правила набора символов, и к тому же многие современные браузеры и серверы при работе с Cookie придерживаются менее строгих правил разбора. В результате используемые правила разбора стали несколько менее строгими.2021Набор символов [`string.ascii_letters`](https://python-all.ru/2.7/library/string.html#string.ascii_letters), [`string.digits`](https://python-all.ru/2.7/library/string.html#string.digits) и `` !#$%&'*+-.^_`|~ `` обозначает множество допустимых символов, которые разрешены этим модулем в имени Cookie (как [`key`](https://python-all.ru/2.7/library/cookie.html#Cookie.Morsel.key)).2223> **Примечание**24>25> При обнаружении недопустимой куки возбуждается исключение [`CookieError`](https://python-all.ru/2.7/library/cookie.html#Cookie.CookieError), поэтому, если данные куки поступают из браузера, всегда следует быть готовым к недопустимым данным и перехватывать [`CookieError`](https://python-all.ru/2.7/library/cookie.html#Cookie.CookieError) при разборе.2627#### `exception Cookie.CookieError`2829Исключение, возникающее из-за недействительности [**RFC 2109**](https://python-all.ru/2.7/library/cookie.html): неверные атрибуты, неверный заголовок *Set-Cookie* и т.д.3031#### `class Cookie.BaseCookie([input])`3233Этот класс является объектом, подобным словарю, ключи которого – строки, а значения – экземпляры [`Morsel`](https://python-all.ru/2.7/library/cookie.html#Cookie.Morsel). Обратите внимание, что при установке ключа в значение, это значение сначала преобразуется в объект [`Morsel`](https://python-all.ru/2.7/library/cookie.html#Cookie.Morsel), содержащий ключ и значение.3435Если передан параметр *input*, он передаётся методу [`load()`](https://python-all.ru/2.7/library/cookie.html#Cookie.BaseCookie.load).3637#### `class Cookie.SimpleCookie([input])`3839Этот класс наследуется от [`BaseCookie`](https://python-all.ru/2.7/library/cookie.html#Cookie.BaseCookie) и переопределяет `value_decode()` и `value_encode()`, превращая их в identity и [`str()`](https://python-all.ru/2.7/library/functions.html#str) соответственно.4041#### `class Cookie.SerialCookie([input])`4243Этот класс наследуется от [`BaseCookie`](https://python-all.ru/2.7/library/cookie.html#Cookie.BaseCookie) и переопределяет `value_decode()` и `value_encode()`, чтобы они стали [`pickle.loads()`](https://python-all.ru/2.7/library/pickle.html#pickle.loads) и [`pickle.dumps()`](https://python-all.ru/2.7/library/pickle.html#pickle.dumps).4445Устарело с версии 2.3: Чтение значений pickle из ненадёжных данных cookie – серьёзная уязвимость, так как строки pickle могут быть специально созданы для выполнения произвольного кода на вашем сервере. Она поддерживается только для обратной совместимости и может быть удалена в будущем.4647#### `class Cookie.SmartCookie([input])`4849Этот класс наследуется от [`BaseCookie`](https://python-all.ru/2.7/library/cookie.html#Cookie.BaseCookie). Он переопределяет `value_decode()` так, чтобы он возвращал [`pickle.loads()`](https://python-all.ru/2.7/library/pickle.html#pickle.loads), если это допустимый pickle, иначе само значение. Он переопределяет `value_encode()` так, чтобы он возвращал [`pickle.dumps()`](https://python-all.ru/2.7/library/pickle.html#pickle.dumps), если это не строка, в противном случае возвращает само значение.5051Устарело с версии 2.3: Те же предупреждения безопасности, что и в [`SerialCookie`](https://python-all.ru/2.7/library/cookie.html#Cookie.SerialCookie), применимы и здесь.5253Стоит сделать ещё одно замечание по безопасности. Для обратной совместимости модуль [`Cookie`](https://python-all.ru/2.7/library/cookie.html#module-Cookie) экспортирует класс с именем `Cookie`, который является просто псевдонимом для [`SmartCookie`](https://python-all.ru/2.7/library/cookie.html#Cookie.SmartCookie). Вероятно, это ошибка, и он будет удалён в одной из будущих версий. Не следует использовать класс `Cookie` в своих приложениях по той же причине, по которой не следует использовать класс [`SerialCookie`](https://python-all.ru/2.7/library/cookie.html#Cookie.SerialCookie).5455> **См. также**56>57> **Модуль [`cookielib`](https://python-all.ru/2.7/library/cookielib.html#module-cookielib)**58>59> Обработка HTTP-куки для веб-*клиентов*. Модули [`cookielib`](https://python-all.ru/2.7/library/cookielib.html#module-cookielib) и [`Cookie`](https://python-all.ru/2.7/library/cookie.html#module-Cookie) не зависят друг от друга.60>61> **[**RFC 2109**](https://python-all.ru/2.7/library/cookie.html) – Механизм управления состоянием HTTP**62>63> Это спецификация управления состоянием, реализованная этим модулем.6465## 20.22.1. Объекты Cookie6667#### `BaseCookie.value_decode(val)`6869Возвращает декодированное значение из строкового представления. Возвращаемое значение может быть любого tипа. Этот метод ничего не делает в [`BaseCookie`](https://python-all.ru/2.7/library/cookie.html#Cookie.BaseCookie) – он существует, чтобы его можно было переопределить.7071#### `BaseCookie.value_encode(val)`7273Возвращает закодированное значение. *val* может быть любого типа, но возвращаемое значение должно быть строкой. Этот метод ничего не делает в [`BaseCookie`](https://python-all.ru/2.7/library/cookie.html#Cookie.BaseCookie) – он существует, чтобы его можно было переопределить.7475В общем случае должно выполняться условие, что [`value_encode()`](https://python-all.ru/2.7/library/cookie.html#Cookie.BaseCookie.value_encode) и [`value_decode()`](https://python-all.ru/2.7/library/cookie.html#Cookie.BaseCookie.value_decode) являются взаимно обратными на области значений *value\_decode*.7677#### `BaseCookie.output([attrs[, header[, sep]]])`7879Возвращает строковое представление, пригодное для отправки в качестве HTTP-заголовков. *attrs* и *header* передаются каждому методу [`output()`](https://python-all.ru/2.7/library/cookie.html#Cookie.BaseCookie.output) объекта [`Morsel`](https://python-all.ru/2.7/library/cookie.html#Cookie.Morsel). *sep* используется для объединения заголовков, и по умолчанию имеет значение `'\r\n'` (CRLF).8081Изменено в версии 2.5: Разделитель по умолчанию изменён с `'\n'` в соответствии со спецификацией cookie.8283#### `BaseCookie.js_output([attrs])`8485Возвращает встраиваемый фрагмент JavaScript, который при выполнении в браузере, поддерживающем JavaScript, будет действовать так же, как если бы были отправлены HTTP-заголовки.8687Значение *attrs* такое же, как в [`output()`](https://python-all.ru/2.7/library/cookie.html#Cookie.BaseCookie.output).8889#### `BaseCookie.load(rawdata)`9091Если *rawdata* является строкой, разобрать её как `HTTP_COOKIE` и добавить найденные значения как объекты [`Morsel`](https://python-all.ru/2.7/library/cookie.html#Cookie.Morsel). Если это словарь, это эквивалентно:9293```python94for k, v in rawdata.items():95    cookie[k] = v96```9798## 20.22.2. Объекты Morsel99100#### `class Cookie.Morsel`101102Абстрагирует пару ключ/значение с атрибутами [**RFC 2109**](https://python-all.ru/2.7/library/cookie.html).103104Объекты Morsel похожи на словари, и их набор ключей постоянен: это допустимые атрибуты [**RFC 2109**](https://python-all.ru/2.7/library/cookie.html), которые105106- `expires`107- `path`108- `comment`109- `domain`110- `max-age`111- `secure`112- `version`113- `httponly`114115Атрибут `httponly` указывает, что cookie передаётся только в HTTP-запросах и недоступен через JavaScript. Это предназначено для снижения риска некоторых форм межсайтового скриптинга.116117Ключи нечувствительны к регистру.118119Новое в версии 2.6: Был добавлен атрибут `httponly`.120121#### `Morsel.value`122123Значение cookie.124125#### `Morsel.coded_value`126127Закодированное значение cookie – именно его следует отправлять.128129#### `Morsel.key`130131Имя cookie.132133#### `Morsel.set(key, value, coded_value)`134135Устанавливает атрибуты *key*, *value* и *coded\_value*.136137#### `Morsel.isReservedKey(K)`138139Проверяет, входит ли *K* в набор ключей [`Morsel`](https://python-all.ru/2.7/library/cookie.html#Cookie.Morsel).140141#### `Morsel.output([attrs[, header]])`142143Возвращает строковое представление Morsel, пригодное для отправки в качестве HTTP-заголовка. По умолчанию включаются все атрибуты, если не указан *attrs* – в этом случае это должен быть список используемых атрибутов. *header* по умолчанию равен `"Set-Cookie:"`.144145#### `Morsel.js_output([attrs])`146147Возвращает встраиваемый фрагмент JavaScript, который при выполнении в браузере, поддерживающем JavaScript, будет действовать так же, как если бы был отправлен HTTP-заголовок.148149Значение *attrs* такое же, как в [`output()`](https://python-all.ru/2.7/library/cookie.html#Cookie.Morsel.output).150151#### `Morsel.OutputString([attrs])`152153Возвращает строку, представляющую Morsel, без какого-либо окружающего HTTP или JavaScript.154155Значение *attrs* такое же, как в [`output()`](https://python-all.ru/2.7/library/cookie.html#Cookie.Morsel.output).156157## 20.22.3. Пример158159Следующий пример демонстрирует, как использовать модуль [`Cookie`](https://python-all.ru/2.7/library/cookie.html#module-Cookie).160161```pycon162>>> import Cookie163>>> C = Cookie.SimpleCookie()164>>> C["fig"] = "newton"165>>> C["sugar"] = "wafer"166>>> print C # сгенерировать HTTP-заголовки167Set-Cookie: fig=newton168Set-Cookie: sugar=wafer169>>> print C.output() # то же самое170Set-Cookie: fig=newton171Set-Cookie: sugar=wafer172>>> C = Cookie.SimpleCookie()173>>> C["rocky"] = "road"174>>> C["rocky"]["path"] = "/cookie"175>>> print C.output(header="Cookie:")176Cookie: rocky=road; Path=/cookie177>>> print C.output(attrs=[], header="Cookie:")178Cookie: rocky=road179>>> C = Cookie.SimpleCookie()180>>> C.load("chips=ahoy; vienna=finger") # загрузить из строки (HTTP-заголовок)181>>> print C182Set-Cookie: chips=ahoy183Set-Cookie: vienna=finger184>>> C = Cookie.SimpleCookie()185>>> C.load('keebler="E=everybody; L=\\"Loves\\"; fudge=\\012;";')186>>> print C187Set-Cookie: keebler="E=everybody; L=\"Loves\"; fudge=\012;"188>>> C = Cookie.SimpleCookie()189>>> C["oreo"] = "doublestuff"190>>> C["oreo"]["path"] = "/"191>>> print C192Set-Cookie: oreo=doublestuff; Path=/193>>> C["twix"] = "none for you"194>>> C["twix"].value195'none for you'196>>> C = Cookie.SimpleCookie()197>>> C["number"] = 7 # эквивалентно C["number"] = str(7)198>>> C["string"] = "seven"199>>> C["number"].value200'7'201>>> C["string"].value202'seven'203>>> print C204Set-Cookie: number=7205Set-Cookie: string=seven206>>> # SerialCookie и SmartCookie устарели207>>> # его использование может привести к появлению уязвимостей безопасности в вашем коде.208>>> C = Cookie.SerialCookie()209>>> C["number"] = 7210>>> C["string"] = "seven"211>>> C["number"].value2127213>>> C["string"].value214'seven'215>>> print C216Set-Cookie: number="I7\012."217Set-Cookie: string="S'seven'\012p1\012."218>>> C = Cookie.SmartCookie()219>>> C["number"] = 7220>>> C["string"] = "seven"221>>> C["number"].value2227223>>> C["string"].value224'seven'225>>> print C226Set-Cookie: number="I7\012."227Set-Cookie: string=seven228```229