cookielib.md
1> **Источник:** https://python-all.ru/2.7/library/cookielib.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 20.21. [`cookielib`](https://python-all.ru/2.7/library/cookielib.html#module-cookielib) – Обработка cookie для HTTP-клиентов89> **Примечание**10>11> Модуль [`cookielib`](https://python-all.ru/2.7/library/cookielib.html#module-cookielib) в Python 3 переименован в `http.cookiejar`. Инструмент [2to3](https://python-all.ru/2.7/glossary.html#term-2to3) при преобразовании исходного кода в Python 3 автоматически адаптирует импорты.1213Новое в версии 2.4.1415**Исходный код:** [Lib/cookielib.py](https://python-all.ru/src/2.7/Lib/cookielib.py)1617---1819Модуль [`cookielib`](https://python-all.ru/2.7/library/cookielib.html#module-cookielib) определяет классы для автоматической обработки HTTP куки. Он полезен для доступа к веб-сайтам, которые требуют, чтобы небольшие фрагменты данных – *куки* – устанавливались на клиентской машине HTTP-ответом от веб-сервера, а затем возвращались серверу в последующих HTTP-запросах.2021Обрабатываются как обычный протокол cookie Netscape, так и протокол, определённый в [**RFC 2965**](https://python-all.ru/2.7/library/cookielib.html). Обработка RFC 2965 по умолчанию отключена. Cookie [**RFC 2109**](https://python-all.ru/2.7/library/cookielib.html) разбираются как cookie Netscape и впоследствии обрабатываются либо как cookie Netscape, либо как cookie RFC 2965 в зависимости от действующей «политики». Обратите внимание, что подавляющее большинство cookie в интернете – это cookie Netscape. [`cookielib`](https://python-all.ru/2.7/library/cookielib.html#module-cookielib) пытается следовать фактическому протоколу cookie Netscape (который существенно отличается от того, что изложено в оригинальной спецификации Netscape), в том числе учитывая атрибуты cookie `max-age` и `port`, введённые в RFC 2965.2223> **Примечание**24>25> Различные именованные параметры в заголовках *Set-Cookie* и *Set-Cookie2* (например, `domain` и `expires`) обычно называют *атрибутами*. Чтобы отличать их от атрибутов Python, в документации этого модуля используется термин *cookie-атрибут*.2627Модуль определяет следующее исключение:2829#### `exception cookielib.LoadError`3031Экземпляры [`FileCookieJar`](https://python-all.ru/2.7/library/cookielib.html#cookielib.FileCookieJar) возбуждают это исключение при невозможности загрузить куки из файла.3233> **Примечание**34>35> Для обратной совместимости с Python 2.4 (который возбуждал [`IOError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.IOError)), [`LoadError`](https://python-all.ru/2.7/library/cookielib.html#cookielib.LoadError) является подклассом [`IOError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.IOError).3637Предоставляются следующие классы:3839#### `class cookielib.CookieJar(policy=None)`4041*policy* – это объект, реализующий интерфейс [`CookiePolicy`](https://python-all.ru/2.7/library/cookielib.html#cookielib.CookiePolicy).4243Класс [`CookieJar`](https://python-all.ru/2.7/library/cookielib.html#cookielib.CookieJar) хранит HTTP-куки. Он извлекает куки из HTTP-запросов и возвращает их в HTTP-ответах. Экземпляры [`CookieJar`](https://python-all.ru/2.7/library/cookielib.html#cookielib.CookieJar) автоматически удаляют устаревшие куки при необходимости. Подклассы также отвечают за сохранение и загрузку куки из файла или базы данных.4445#### `class cookielib.FileCookieJar(filename, delayload=None, policy=None)`4647*policy* – это объект, реализующий интерфейс [`CookiePolicy`](https://python-all.ru/2.7/library/cookielib.html#cookielib.CookiePolicy). Остальные аргументы описаны в документации соответствующих атрибутов.4849[`CookieJar`](https://python-all.ru/2.7/library/cookielib.html#cookielib.CookieJar), который может загружать куки из файла на диске и, возможно, сохранять их туда. Куки **НЕ** загружаются из указанного файла до тех пор, пока не будет вызван метод [`load()`](https://python-all.ru/2.7/library/cookielib.html#cookielib.FileCookieJar.load) или [`revert()`](https://python-all.ru/2.7/library/cookielib.html#cookielib.FileCookieJar.revert). Подклассы этого класса описаны в разделе [Подклассы FileCookieJar и взаимодействие с веб-браузерами](https://python-all.ru/2.7/library/cookielib.html#file-cookie-jar-classes).5051#### `class cookielib.CookiePolicy`5253Этот класс отвечает за принятие решения о том, следует ли принять каждый куки от сервера / вернуть его серверу.5455#### `class cookielib.DefaultCookiePolicy(blocked_domains=None, allowed_domains=None, netscape=True, rfc2965=False, rfc2109_as_netscape=None, hide_cookie2=False, strict_domain=False, strict_rfc2965_unverifiable=True, strict_ns_unverifiable=False, strict_ns_domain=DefaultCookiePolicy.DomainLiberal, strict_ns_set_initial_dollar=False, strict_ns_set_path=False)`5657Аргументы конструктора должны передаваться только как именованные аргументы. *blocked\_domains* – это последовательность доменных имен, с которых мы никогда не принимаем куки и на которые никогда не отправляем их. *allowed\_domains*, если не [`None`](https://python-all.ru/2.7/library/constants.html#None), – это последовательность доменов, единственных, для которых мы принимаем и возвращаем куки. По всем остальным аргументам смотрите документацию для объектов [`CookiePolicy`](https://python-all.ru/2.7/library/cookielib.html#cookielib.CookiePolicy) и [`DefaultCookiePolicy`](https://python-all.ru/2.7/library/cookielib.html#cookielib.DefaultCookiePolicy).5859[`DefaultCookiePolicy`](https://python-all.ru/2.7/library/cookielib.html#cookielib.DefaultCookiePolicy) реализует стандартные правила принятия/отклонения для куки Netscape и RFC 2965. По умолчанию, куки RFC 2109 (то есть куки, полученные в заголовке *Set-Cookie* с атрибутом version, равным 1) обрабатываются по правилам RFC 2965. Однако, если обработка RFC 2965 отключена или [`rfc2109_as_netscape`](https://python-all.ru/2.7/library/cookielib.html#cookielib.DefaultCookiePolicy.rfc2109_as_netscape) равен `True`, куки RFC 2109 «понижаются» экземпляром [`CookieJar`](https://python-all.ru/2.7/library/cookielib.html#cookielib.CookieJar) до куков Netscape, путём установки атрибута `version` экземпляра [`Cookie`](https://python-all.ru/2.7/library/cookielib.html#cookielib.Cookie) в 0. [`DefaultCookiePolicy`](https://python-all.ru/2.7/library/cookielib.html#cookielib.DefaultCookiePolicy) также предоставляет некоторые параметры для тонкой настройки политики.6061#### `class cookielib.Cookie`6263Этот класс представляет куки Netscape, RFC 2109 и RFC 2965. Не предполагается, что пользователи [`cookielib`](https://python-all.ru/2.7/library/cookielib.html#module-cookielib) будут создавать собственные экземпляры [`Cookie`](https://python-all.ru/2.7/library/cookielib.html#cookielib.Cookie). Вместо этого, при необходимости, следует вызывать `make_cookies()` для экземпляра [`CookieJar`](https://python-all.ru/2.7/library/cookielib.html#cookielib.CookieJar).6465> **См. также**66>67> **Модуль [`urllib2`](https://python-all.ru/2.7/library/urllib2.html#module-urllib2)**68>69> Открытие URL с автоматической обработкой куки.70>71> **Модуль [`Cookie`](https://python-all.ru/2.7/library/cookie.html#module-Cookie)**72>73> Классы 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) не зависят друг от друга.74>75> **[https://curl.haxx.se/rfc/cookie\_spec.html](https://python-all.ru/2.7/library/cookielib.html)**76>77> Спецификация оригинального протокола Netscape cookie. Хотя это всё ещё доминирующий протокол, «протокол Netscape cookie», реализованный всеми основными браузерами (и [`cookielib`](https://python-all.ru/2.7/library/cookielib.html#module-cookielib)), лишь отдалённо напоминает тот, что описан в `cookie_spec.html`.78>79> **[**RFC 2109**](https://python-all.ru/2.7/library/cookielib.html) – Механизм управления состоянием HTTP**80>81> Заменено RFC 2965. Использует *Set-Cookie* с version=1.82>83> **[**RFC 2965**](https://python-all.ru/2.7/library/cookielib.html) – Механизм управления состоянием HTTP**84>85> Протокол Netscape с исправленными ошибками. Использует *Set-Cookie2* вместо *Set-Cookie*. Широко не используется.86>87> **[http://kristol.org/cookie/errata.html](https://python-all.ru/2.7/library/cookielib.html)**88>89> Незавершённые исправления к RFC 2965.90>91> [**RFC 2964**](https://python-all.ru/2.7/library/cookielib.html) – Использование управления состоянием HTTP9293## 20.21.1. Объекты CookieJar и FileCookieJar9495Объекты [`CookieJar`](https://python-all.ru/2.7/library/cookielib.html#cookielib.CookieJar) поддерживают протокол [итератора](https://python-all.ru/2.7/glossary.html#term-iterator) для итерации по содержащимся объектам [`Cookie`](https://python-all.ru/2.7/library/cookielib.html#cookielib.Cookie).9697[`CookieJar`](https://python-all.ru/2.7/library/cookielib.html#cookielib.CookieJar) имеет следующие методы:9899#### `CookieJar.add_cookie_header(request)`100101Добавляет правильный заголовок *Cookie* к *запросу*.102103Если политика разрешает (т.е. атрибуты `rfc2965` и `hide_cookie2` экземпляра [`CookieJar`](https://python-all.ru/2.7/library/cookielib.html#cookielib.CookieJar)'s [`CookiePolicy`](https://python-all.ru/2.7/library/cookielib.html#cookielib.CookiePolicy) равны, соответственно, true и false), заголовок *Cookie2* также добавляется, когда это уместно.104105Объект *request* (обычно экземпляр [`urllib2.Request`](https://python-all.ru/2.7/library/urllib2.html#urllib2.Request)) должен поддерживать методы `get_full_url()`, `get_host()`, `get_type()`, `unverifiable()`, `get_origin_req_host()`, `has_header()`, `get_header()`, `header_items()` и `add_unredirected_header()`, как описано в [`urllib2`](https://python-all.ru/2.7/library/urllib2.html#module-urllib2).106107#### `CookieJar.extract_cookies(response, request)`108109Извлекает куки из HTTP-*ответа* и сохраняет их в [`CookieJar`](https://python-all.ru/2.7/library/cookielib.html#cookielib.CookieJar), где это разрешено политикой.110111[`CookieJar`](https://python-all.ru/2.7/library/cookielib.html#cookielib.CookieJar) будет искать допустимые заголовки *Set-Cookie* и *Set-Cookie2* в аргументе *ответа*, и сохранять cookie соответствующим образом (с учётом одобрения метода [`CookiePolicy.set_ok()`](https://python-all.ru/2.7/library/cookielib.html#cookielib.CookiePolicy.set_ok)).112113Объект *response* (обычно результат вызова [`urllib2.urlopen()`](https://python-all.ru/2.7/library/urllib2.html#urllib2.urlopen) или аналогичного) должен поддерживать метод `info()`, который возвращает объект с методом `getallmatchingheaders()` (обычно экземпляр [`mimetools.Message`](https://python-all.ru/2.7/library/mimetools.html#mimetools.Message)).114115Объект *request* (обычно экземпляр [`urllib2.Request`](https://python-all.ru/2.7/library/urllib2.html#urllib2.Request)) должен поддерживать методы `get_full_url()`, `get_host()`, `unverifiable()` и `get_origin_req_host()`, как описано в [`urllib2`](https://python-all.ru/2.7/library/urllib2.html#module-urllib2). Запрос используется для установки значений по умолчанию для атрибутов куки, а также для проверки, разрешена ли установка куки.116117#### `CookieJar.set_policy(policy)`118119Устанавливает используемый экземпляр [`CookiePolicy`](https://python-all.ru/2.7/library/cookielib.html#cookielib.CookiePolicy).120121#### `CookieJar.make_cookies(response, request)`122123Возвращает последовательность объектов [`Cookie`](https://python-all.ru/2.7/library/cookielib.html#cookielib.Cookie), извлечённых из объекта *ответа*.124125Смотрите документацию к [`extract_cookies()`](https://python-all.ru/2.7/library/cookielib.html#cookielib.CookieJar.extract_cookies) для описания интерфейсов, требуемых от аргументов *ответа* и *запроса*.126127#### `CookieJar.set_cookie_if_ok(cookie, request)`128129Устанавливает [`Cookie`](https://python-all.ru/2.7/library/cookielib.html#cookielib.Cookie), если политика разрешает это.130131#### `CookieJar.set_cookie(cookie)`132133Устанавливает [`Cookie`](https://python-all.ru/2.7/library/cookielib.html#cookielib.Cookie) без проверки политики, следует ли его устанавливать.134135#### `CookieJar.clear([domain[, path[, name]]])`136137Очищает некоторые куки.138139Если вызван без аргументов, очищает все cookie. Если передан один аргумент, удаляются только cookie, принадлежащие этому *домену*. Если передано два аргумента, удаляются cookie, принадлежащие указанному *домену* и URL-*пути*. Если передано три аргумента, то удаляется cookie с указанными *доменом*, *путём* и *именем*.140141Возбуждает [`KeyError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.KeyError), если соответствующая cookie не найдена.142143#### `CookieJar.clear_session_cookies()`144145Удалить все сессионные куки.146147Удаляет все содержащиеся cookie, у которых атрибут `discard` имеет значение true (обычно потому, что у них не было атрибута cookie `max-age` или `expires`, либо был явный атрибут cookie `discard`). Для интерактивных браузеров окончание сессии обычно соответствует закрытию окна браузера.148149Обратите внимание, что метод `save()` в любом случае не сохраняет сессионные куки, если не указать иное, передав аргумент *ignore\_discard* со значением True.150151[`FileCookieJar`](https://python-all.ru/2.7/library/cookielib.html#cookielib.FileCookieJar) реализует следующие дополнительные методы:152153#### `FileCookieJar.save(filename=None, ignore_discard=False, ignore_expires=False)`154155Сохраняет куки в файл.156157Этот базовый класс вызывает исключение [`NotImplementedError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.NotImplementedError). Подклассы могут оставлять этот метод нереализованным.158159*filename* is the name of file in which to save cookies. If *filename* is not specified, `self.filename` is used (whose default is the value passed to the constructor, if any); if `self.filename` is [`None`](https://python-all.ru/2.7/library/constants.html#None), [`ValueError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.ValueError) is raised.160161*ignore\_discard*: сохранять даже те куки, которые помечены к удалению. *ignore\_expires*: сохранять даже куки с истекшим сроком действия.162163Файл перезаписывается, если он уже существует, при этом удаляются все куки, которые он содержит. Сохраненные куки можно восстановить позже с помощью методов [`load()`](https://python-all.ru/2.7/library/cookielib.html#cookielib.FileCookieJar.load) или [`revert()`](https://python-all.ru/2.7/library/cookielib.html#cookielib.FileCookieJar.revert).164165#### `FileCookieJar.load(filename=None, ignore_discard=False, ignore_expires=False)`166167Загружает куки из файла.168169Старые куки сохраняются, если они не перезаписываются вновь загруженными.170171Аргументы такие же, как для [`save()`](https://python-all.ru/2.7/library/cookielib.html#cookielib.FileCookieJar.save).172173Указанный файл должен быть в формате, понятном классу, иначе будет возбуждено [`LoadError`](https://python-all.ru/2.7/library/cookielib.html#cookielib.LoadError). Кроме того, может быть возбуждено [`IOError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.IOError), например, если файл не существует.174175> **Примечание**176>177> Для обратной совместимости с Python 2.4 (который возбуждал [`IOError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.IOError)), [`LoadError`](https://python-all.ru/2.7/library/cookielib.html#cookielib.LoadError) является подклассом [`IOError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.IOError).178179#### `FileCookieJar.revert(filename=None, ignore_discard=False, ignore_expires=False)`180181Очищает все куки и перезагружает куки из сохраненного файла.182183[`revert()`](https://python-all.ru/2.7/library/cookielib.html#cookielib.FileCookieJar.revert) может возбуждать те же исключения, что и [`load()`](https://python-all.ru/2.7/library/cookielib.html#cookielib.FileCookieJar.load). В случае неудачи состояние объекта не изменится.184185Экземпляры [`FileCookieJar`](https://python-all.ru/2.7/library/cookielib.html#cookielib.FileCookieJar) имеют следующие открытые атрибуты:186187#### `FileCookieJar.filename`188189Имя файла по умолчанию, в котором хранятся куки. Этому атрибуту можно присваивать значение.190191#### `FileCookieJar.delayload`192193Если истина, загружать куки с диска лениво. Этому атрибуту не следует присваивать значение. Это всего лишь подсказка, поскольку влияет только на производительность, а не на поведение (если только куки на диске не изменяются). Объект [`CookieJar`](https://python-all.ru/2.7/library/cookielib.html#cookielib.CookieJar) может игнорировать её. Ни один из классов [`FileCookieJar`](https://python-all.ru/2.7/library/cookielib.html#cookielib.FileCookieJar), входящих в стандартную библиотеку, не загружает куки лениво.194195## 20.21.2. Подклассы FileCookieJar и взаимодействие с веб-браузерами196197Следующие подклассы [`CookieJar`](https://python-all.ru/2.7/library/cookielib.html#cookielib.CookieJar) предоставляются для чтения и записи.198199#### `class cookielib.MozillaCookieJar(filename, delayload=None, policy=None)`200201[`FileCookieJar`](https://python-all.ru/2.7/library/cookielib.html#cookielib.FileCookieJar), который может загружать и сохранять куки на диск в файловом формате Mozilla `cookies.txt` (также используется браузерами Lynx и Netscape).202203> **Примечание**204>205> Версия 3 веб-браузера Firefox больше не записывает куки в формат файла `cookies.txt`.206207> **Примечание**208>209> Это приводит к потере информации о куках RFC 2965, а также о более новых или нестандартных атрибутах куков, таких как `port`.210211> **Предупреждение**212>213> Сделайте резервную копию ваших куки перед сохранением, если у вас есть куки, потеря или повреждение которых будут нежелательны (есть некоторые тонкости, которые могут привести к небольшим изменениям в файле при полном цикле загрузки/сохранения).214215Также учтите, что куки, сохраненные во время работы Mozilla, будут перезаписаны Mozilla.216217#### `class cookielib.LWPCookieJar(filename, delayload=None, policy=None)`218219Объект [`FileCookieJar`](https://python-all.ru/2.7/library/cookielib.html#cookielib.FileCookieJar), который может загружать и сохранять куки на диск в формате, совместимом с форматом файлов `Set-Cookie3` библиотеки libwww-perl. Это удобно, если нужно хранить куки в файле, читаемом человеком.220221## 20.21.3. Объекты CookiePolicy222223Объекты, реализующие интерфейс [`CookiePolicy`](https://python-all.ru/2.7/library/cookielib.html#cookielib.CookiePolicy), имеют следующие методы:224225#### `CookiePolicy.set_ok(cookie, request)`226227Возвращает логическое значение, указывающее, следует ли принять куки от сервера.228229*cookie* – экземпляр [`cookielib.Cookie`](https://python-all.ru/2.7/library/cookielib.html#cookielib.Cookie). *request* – объект, реализующий интерфейс, описанный в документации для [`CookieJar.extract_cookies()`](https://python-all.ru/2.7/library/cookielib.html#cookielib.CookieJar.extract_cookies).230231#### `CookiePolicy.return_ok(cookie, request)`232233Возвращает логическое значение, указывающее, следует ли вернуть куки серверу.234235*cookie* – экземпляр [`cookielib.Cookie`](https://python-all.ru/2.7/library/cookielib.html#cookielib.Cookie). *request* – объект, реализующий интерфейс, описанный в документации для [`CookieJar.add_cookie_header()`](https://python-all.ru/2.7/library/cookielib.html#cookielib.CookieJar.add_cookie_header).236237#### `CookiePolicy.domain_return_ok(domain, request)`238239Возвращает false, если cookie не должны быть возвращены для данного домена cookie.240241Этот метод – оптимизация. Он избавляет от необходимости проверять каждый куки для определённого домена (что может потребовать чтения многих файлов). Возврат true от [`domain_return_ok()`](https://python-all.ru/2.7/library/cookielib.html#cookielib.CookiePolicy.domain_return_ok) и [`path_return_ok()`](https://python-all.ru/2.7/library/cookielib.html#cookielib.CookiePolicy.path_return_ok) оставляет всю работу [`return_ok()`](https://python-all.ru/2.7/library/cookielib.html#cookielib.CookiePolicy.return_ok).242243Если [`domain_return_ok()`](https://python-all.ru/2.7/library/cookielib.html#cookielib.CookiePolicy.domain_return_ok) возвращает true для домена куки, [`path_return_ok()`](https://python-all.ru/2.7/library/cookielib.html#cookielib.CookiePolicy.path_return_ok) вызывается для пути куки. В противном случае [`path_return_ok()`](https://python-all.ru/2.7/library/cookielib.html#cookielib.CookiePolicy.path_return_ok) и [`return_ok()`](https://python-all.ru/2.7/library/cookielib.html#cookielib.CookiePolicy.return_ok) никогда не вызываются для этого домена куки. Если [`path_return_ok()`](https://python-all.ru/2.7/library/cookielib.html#cookielib.CookiePolicy.path_return_ok) возвращает true, [`return_ok()`](https://python-all.ru/2.7/library/cookielib.html#cookielib.CookiePolicy.return_ok) вызывается с объектом [`Cookie`](https://python-all.ru/2.7/library/cookielib.html#cookielib.Cookie) для полной проверки. В противном случае [`return_ok()`](https://python-all.ru/2.7/library/cookielib.html#cookielib.CookiePolicy.return_ok) никогда не вызывается для этого пути куки.244245Обратите внимание, что [`domain_return_ok()`](https://python-all.ru/2.7/library/cookielib.html#cookielib.CookiePolicy.domain_return_ok) вызывается для каждого *домена куки*, а не только для *домена запроса*. Например, функция может вызываться как с `".example.com"`, так и с `"www.example.com"`, если домен запроса – `"www.example.com"`. То же самое относится к [`path_return_ok()`](https://python-all.ru/2.7/library/cookielib.html#cookielib.CookiePolicy.path_return_ok).246247Аргумент *request* описан в документации [`return_ok()`](https://python-all.ru/2.7/library/cookielib.html#cookielib.CookiePolicy.return_ok).248249#### `CookiePolicy.path_return_ok(path, request)`250251Возвращает false, если cookie не должны быть возвращены для указанного пути cookie.252253См. документацию [`domain_return_ok()`](https://python-all.ru/2.7/library/cookielib.html#cookielib.CookiePolicy.domain_return_ok).254255Помимо реализации методов, описанных выше, реализации интерфейса [`CookiePolicy`](https://python-all.ru/2.7/library/cookielib.html#cookielib.CookiePolicy) должны также предоставлять следующие атрибуты, указывающие, какие протоколы следует использовать и как. Все эти атрибуты могут быть изменены (присвоены).256257#### `CookiePolicy.netscape`258259Реализация протокола Netscape.260261#### `CookiePolicy.rfc2965`262263Реализует протокол RFC 2965.264265#### `CookiePolicy.hide_cookie2`266267Не добавлять заголовок *Cookie2* к запросам (наличие этого заголовка указывает серверу на то, что мы понимаем куки RFC 2965).268269Самый удобный способ определить класс [`CookiePolicy`](https://python-all.ru/2.7/library/cookielib.html#cookielib.CookiePolicy) – это создать подкласс от [`DefaultCookiePolicy`](https://python-all.ru/2.7/library/cookielib.html#cookielib.DefaultCookiePolicy) и переопределить некоторые (или все) методы выше. Сам [`CookiePolicy`](https://python-all.ru/2.7/library/cookielib.html#cookielib.CookiePolicy) может использоваться как «нулевая политика», позволяющая устанавливать и принимать любые куки (вряд ли это будет полезно).270271## 20.21.4. Объекты DefaultCookiePolicy272273Реализует стандартные правила принятия и возврата куки.274275Охватываются как куки RFC 2965, так и Netscape. Обработка RFC 2965 отключена по умолчанию.276277Самый простой способ создать свою политику – переопределить этот класс и вызывать его методы в ваших переопределённых реализациях перед добавлением собственных дополнительных проверок:278279```python280import cookielib281class MyCookiePolicy(cookielib.DefaultCookiePolicy):282 def set_ok(self, cookie, request):283 if not cookielib.DefaultCookiePolicy.set_ok(self, cookie, request):284 return False285 if i_dont_want_to_store_this_cookie(cookie):286 return False287 return True288```289290Помимо возможностей, необходимых для реализации интерфейса [`CookiePolicy`](https://python-all.ru/2.7/library/cookielib.html#cookielib.CookiePolicy), этот класс позволяет блокировать и разрешать домены при установке и получении куки. Также есть несколько переключателей строгости, которые позволяют немного ужесточить довольно свободные правила протокола Netscape (ценой блокировки некоторых безвредных куки).291292Предоставляются чёрный и белый списки доменов (оба отключены по умолчанию). В установке и возврате cookie участвуют только домены, не входящие в чёрный список и присутствующие в белом списке (если белый список активен). Используйте аргумент конструктора *blocked\_domains* и методы `blocked_domains()` и `set_blocked_domains()` (а также соответствующие аргумент и методы для *allowed\_domains*). Если белый список установлен, его можно снова отключить, присвоив ему значение [`None`](https://python-all.ru/2.7/library/constants.html#None).293294Домены из чёрного или белого списков, которые не начинаются с точки, должны в точности совпадать с доменом cookie для сопоставления. Например, `"example.com"` соответствует записи чёрного списка `"example.com"`, а `"www.example.com"` – нет. Домены, начинающиеся с точки, также сопоставляются с более конкретными доменами. Например, и `"www.example.com"`, и `"www.coyote.example.com"` соответствуют `".example.com"` (но сам `"example.com"` не соответствует). IP-адреса являются исключением и должны совпадать точно. Например, если blocked\_domains содержит `"192.168.1.2"` и `".168.1.2"`, то 192.168.1.2 блокируется, а 193.168.1.2 – нет.295296[`DefaultCookiePolicy`](https://python-all.ru/2.7/library/cookielib.html#cookielib.DefaultCookiePolicy) реализует следующие дополнительные методы:297298#### `DefaultCookiePolicy.blocked_domains()`299300Возвращает последовательность заблокированных доменов (в виде кортежа).301302#### `DefaultCookiePolicy.set_blocked_domains(blocked_domains)`303304Устанавливает последовательность заблокированных доменов.305306#### `DefaultCookiePolicy.is_blocked(domain)`307308Возвращает, находится ли *domain* в чёрном списке для установки или получения куки.309310#### `DefaultCookiePolicy.allowed_domains()`311312Возвращает [`None`](https://python-all.ru/2.7/library/constants.html#None) или последовательность разрешённых доменов (в виде кортежа).313314#### `DefaultCookiePolicy.set_allowed_domains(allowed_domains)`315316Устанавливает последовательность разрешённых доменов или [`None`](https://python-all.ru/2.7/library/constants.html#None).317318#### `DefaultCookiePolicy.is_not_allowed(domain)`319320Возвращает, не находится ли *domain* в белом списке для установки или получения куки.321322Экземпляры [`DefaultCookiePolicy`](https://python-all.ru/2.7/library/cookielib.html#cookielib.DefaultCookiePolicy) имеют следующие атрибуты, все они инициализируются из аргументов конструктора с теми же именами, и всем им можно присваивать значения.323324#### `DefaultCookiePolicy.rfc2109_as_netscape`325326Если true, запросить, чтобы экземпляр [`CookieJar`](https://python-all.ru/2.7/library/cookielib.html#cookielib.CookieJar) понижал cookie RFC 2109 (то есть cookie, полученные в заголовке *Set-Cookie* с атрибутом version cookie-attribute равным 1) до cookie Netscape, устанавливая атрибут версии экземпляра [`Cookie`](https://python-all.ru/2.7/library/cookielib.html#cookielib.Cookie) в 0. Значение по умолчанию – [`None`](https://python-all.ru/2.7/library/constants.html#None), и в этом случае cookie RFC 2109 понижаются только при отключённой обработке RFC 2965. Следовательно, по умолчанию cookie RFC 2109 понижаются.327328Новое в версии 2.5.329330Общие переключатели строгости:331332#### `DefaultCookiePolicy.strict_domain`333334Не разрешает сайтам устанавливать двухкомпонентные домены с национальными доменами верхнего уровня, такими как `.co.uk`, `.gov.uk`, `.co.nz` и т.д. Это далеко от совершенства и не гарантирует работу!335336Переключатели строгости протокола RFC 2965:337338#### `DefaultCookiePolicy.strict_rfc2965_unverifiable`339340Следовать правилам RFC 2965 для непроверяемых транзакций (обычно непроверяемая транзакция возникает в результате перенаправления или запроса изображения, размещённого на другом сайте). Если это False, куки *никогда* не блокируются на основе проверяемости.341342Переключатели строгости протокола Netscape:343344#### `DefaultCookiePolicy.strict_ns_unverifiable`345346Применять правила RFC 2965 для непроверяемых транзакций даже к куки Netscape.347348#### `DefaultCookiePolicy.strict_ns_domain`349350Флаги, указывающие, насколько строгими должны быть правила сопоставления доменов для cookies Netscape. Допустимые значения приведены ниже.351352#### `DefaultCookiePolicy.strict_ns_set_initial_dollar`353354Игнорирует cookies в заголовках Set-Cookie, имена которых начинаются с `'$'`.355356#### `DefaultCookiePolicy.strict_ns_set_path`357358Не разрешать установку куки, путь которых не соответствует URI запроса.359360`strict_ns_domain` – это набор флагов. Его значение формируется путём логического ИЛИ (например, `DomainStrictNoDots|DomainStrictNonDomain` означает, что установлены оба флага).361362#### `DefaultCookiePolicy.DomainStrictNoDots`363364При установке cookie «префикс хоста» не должен содержать точку (например, `www.foo.bar.com` не может установить cookie для `.bar.com`, потому что `www.foo` содержит точку).365366#### `DefaultCookiePolicy.DomainStrictNonDomain`367368Cookie, которые не указали явно атрибут cookie `domain`, могут быть возвращены только домену, равному домену, установившему cookie (например, `spam.example.com` не будут возвращены cookie от `example.com`, у которых не было атрибута cookie `domain`).369370#### `DefaultCookiePolicy.DomainRFC2965Match`371372При установке куки требовать полного соответствия домена по RFC 2965.373374Следующие атрибуты предоставлены для удобства и представляют собой наиболее полезные комбинации указанных выше флагов:375376#### `DefaultCookiePolicy.DomainLiberal`377378Эквивалентно 0 (то есть все указанные выше флаги строгости домена Netscape отключены).379380#### `DefaultCookiePolicy.DomainStrict`381382Эквивалентно `DomainStrictNoDots|DomainStrictNonDomain`.383384## 20.21.5. Объекты Cookie385386Экземпляры [`Cookie`](https://python-all.ru/2.7/library/cookielib.html#cookielib.Cookie) имеют атрибуты Python, примерно соответствующие стандартным атрибутам cookie, определённым в различных стандартах cookie. Это соответствие не является взаимно однозначным, так как существуют сложные правила присвоения значений по умолчанию, а также потому, что атрибуты cookie `max-age` и `expires` содержат эквивалентную информацию, и потому что cookie RFC 2109 могут быть 'понижены' [`cookielib`](https://python-all.ru/2.7/library/cookielib.html#module-cookielib) с версии 1 до версии 0 (Netscape).387388Присваивание этим атрибутам должно быть необходимо только в редких случаях, например в методе [`CookiePolicy`](https://python-all.ru/2.7/library/cookielib.html#cookielib.CookiePolicy). Класс не обеспечивает внутренней согласованности, поэтому следует понимать, что делается при таком присваивании.389390#### `Cookie.version`391392Целое число или [`None`](https://python-all.ru/2.7/library/constants.html#None). Cookie Netscape имеют [`version`](https://python-all.ru/2.7/library/cookielib.html#cookielib.Cookie.version) 0. Cookie RFC 2965 и RFC 2109 имеют атрибут cookie `version` равный 1. Однако обратите внимание, что [`cookielib`](https://python-all.ru/2.7/library/cookielib.html#module-cookielib) может 'понижать' cookie RFC 2109 до cookie Netscape, и в этом случае [`version`](https://python-all.ru/2.7/library/cookielib.html#cookielib.Cookie.version) равно 0.393394#### `Cookie.name`395396Имя cookie (строка).397398#### `Cookie.value`399400Значение cookie (строка) или [`None`](https://python-all.ru/2.7/library/constants.html#None).401402#### `Cookie.port`403404Строка, представляющая порт или набор портов (например, ‘80’ или ‘80,8080’), или [`None`](https://python-all.ru/2.7/library/constants.html#None).405406#### `Cookie.path`407408Путь cookie (строка, например `'/acme/rocket_launchers'`).409410#### `Cookie.secure`411412`True`, если cookie должна возвращаться только через защищённое соединение.413414#### `Cookie.expires`415416Целочисленная дата истечения срока в секундах от начала эпохи или [`None`](https://python-all.ru/2.7/library/constants.html#None). См. также метод [`is_expired()`](https://python-all.ru/2.7/library/cookielib.html#cookielib.Cookie.is_expired).417418#### `Cookie.discard`419420`True`, если это сессионный cookie.421422#### `Cookie.comment`423424Строковый комментарий от сервера, поясняющий назначение этого cookie, или [`None`](https://python-all.ru/2.7/library/constants.html#None).425426#### `Cookie.comment_url`427428URL, ведущий на комментарий от сервера, поясняющий назначение этого cookie, или [`None`](https://python-all.ru/2.7/library/constants.html#None).429430#### `Cookie.rfc2109`431432`True`, если этот cookie был получен как cookie RFC 2109 (то есть cookie пришёл в заголовке *Set-Cookie*, и значение атрибута Version в этом заголовке было равно 1). Этот атрибут предоставлен, потому что [`cookielib`](https://python-all.ru/2.7/library/cookielib.html#module-cookielib) может 'понижать' cookie RFC 2109 до cookie Netscape, и в этом случае [`version`](https://python-all.ru/2.7/library/cookielib.html#cookielib.Cookie.version) равно 0.433434Новое в версии 2.5.435436#### `Cookie.port_specified`437438`True`, если порт или набор портов был явно указан сервером (в заголовке *Set-Cookie* / *Set-Cookie2*).439440#### `Cookie.domain_specified`441442`True`, если домен был явно указан сервером.443444#### `Cookie.domain_initial_dot`445446`True`, если домен, явно указанный сервером, начинался с точки (`'.'`).447448Cookie могут иметь дополнительные нестандартные атрибуты cookie. Доступ к ним можно получить с помощью следующих методов:449450#### `Cookie.has_nonstandard_attr(name)`451452Возвращает true, если cookie имеет атрибут с указанным именем.453454#### `Cookie.get_nonstandard_attr(name, default=None)`455456Если cookie имеет указанный атрибут cookie, возвращает его значение. В противном случае возвращает *default*.457458#### `Cookie.set_nonstandard_attr(name, value)`459460Устанавливает значение указанного атрибута cookie.461462Класс [`Cookie`](https://python-all.ru/2.7/library/cookielib.html#cookielib.Cookie) также определяет следующий метод:463464#### `Cookie.is_expired([now=None])`465466`True`, если срок действия cookie истёк (прошло время, указанное сервером для истечения). Если передан *now* (в секундах с начала эпохи), возвращается, истёк ли срок действия cookie на указанный момент времени.467468## 20.21.6. Примеры469470Первый пример показывает наиболее распространённое использование [`cookielib`](https://python-all.ru/2.7/library/cookielib.html#module-cookielib):471472```python473import cookielib, urllib2474cj = cookielib.CookieJar()475opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))476r = opener.open("http://example.com/")477```478479Этот пример иллюстрирует, как открыть URL с использованием ваших куки Netscape, Mozilla или Lynx (предполагается соглашение Unix/Netscape о местоположении файла куки):480481```python482import os, cookielib, urllib2483cj = cookielib.MozillaCookieJar()484cj.load(os.path.join(os.path.expanduser("~"), ".netscape", "cookies.txt"))485opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))486r = opener.open("http://example.com/")487```488489The next example illustrates the use of [`DefaultCookiePolicy`](https://python-all.ru/2.7/library/cookielib.html#cookielib.DefaultCookiePolicy). Turn on RFC 2965 cookies, be more strict about domains when setting and returning Netscape cookies, and block some domains from setting cookies or having them returned:490491```python492import urllib2493from cookielib import CookieJar, DefaultCookiePolicy494policy = DefaultCookiePolicy(495 rfc2965=True, strict_ns_domain=DefaultCookiePolicy.DomainStrict,496 blocked_domains=["ads.net", ".ads.net"])497cj = CookieJar(policy)498opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))499r = opener.open("http://example.com/")500```501