http.cookiejar.md
1> **Источник:** https://python-all.ru/3.1/library/http.cookiejar.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 20.22. `http.cookiejar` – Обработка cookie для HTTP-клиентов89Модуль `http.cookiejar` определяет классы для автоматической обработки HTTP-куки. Он полезен для доступа к веб-сайтам, которые требуют, чтобы небольшие фрагменты данных – *куки* – были установлены на клиентской машине HTTP-ответом от веб-сервера, а затем возвращены серверу в последующих HTTP-запросах.1011Обрабатываются как обычный протокол Netscape cookie, так и протокол, определённый в [**RFC 2965**](https://python-all.ru/3.1/library/http.cookiejar.html). Обработка RFC 2965 по умолчанию отключена. [**RFC 2109**](https://python-all.ru/3.1/library/http.cookiejar.html) куки разбираются как куки Netscape и впоследствии обрабатываются либо как куки Netscape, либо как куки RFC 2965 в соответствии с действующей «политикой». Обратите внимание, что подавляющее большинство куки в Интернете – это куки Netscape. `http.cookiejar` пытается следовать фактическому протоколу Netscape cookie (который существенно отличается от изложенного в оригинальной спецификации Netscape), включая учёт атрибутов куки `max-age` и `port`, введённых в RFC 2965.1213> **Примечание**14>15> Различные именованные параметры, встречающиеся в заголовках *Set-Cookie* и *Set-Cookie2* (например, `domain` и `expires`), обычно называют *атрибутами*. Чтобы отличать их от атрибутов Python, в документации этого модуля используется термин *cookie-attribute*.1617Модуль определяет следующее исключение:1819#### `exception http.cookiejar.LoadError`2021Экземпляры2223[`FileCookieJar`](https://python-all.ru/3.1/library/http.cookiejar.html#http.cookiejar.FileCookieJar)2425вызывают это исключение при сбое загрузки куки из файла.2627[`LoadError`](https://python-all.ru/3.1/library/http.cookiejar.html#http.cookiejar.LoadError)2829является подклассом3031[`IOError`](https://python-all.ru/3.1/library/exceptions.html#IOError)3233.3435Предоставляются следующие классы:3637#### `class http.cookiejar.CookieJar(policy=None)`3839*policy* – это объект, реализующий интерфейс [`CookiePolicy`](https://python-all.ru/3.1/library/http.cookiejar.html#http.cookiejar.CookiePolicy).4041The [`CookieJar`](https://python-all.ru/3.1/library/http.cookiejar.html#http.cookiejar.CookieJar) class stores HTTP cookies. It extracts cookies from HTTP requests, and returns them in HTTP responses. [`CookieJar`](https://python-all.ru/3.1/library/http.cookiejar.html#http.cookiejar.CookieJar) instances automatically expire contained cookies when necessary. Subclasses are also responsible for storing and retrieving cookies from a file or database.4243#### `class http.cookiejar.FileCookieJar(filename, delayload=None, policy=None)`4445*policy* – это объект, реализующий интерфейс [`CookiePolicy`](https://python-all.ru/3.1/library/http.cookiejar.html#http.cookiejar.CookiePolicy). Остальные аргументы описаны в документации соответствующих атрибутов.4647A [`CookieJar`](https://python-all.ru/3.1/library/http.cookiejar.html#http.cookiejar.CookieJar) which can load cookies from, and perhaps save cookies to, a file on disk. Cookies are **NOT** loaded from the named file until either the [`load()`](https://python-all.ru/3.1/library/http.cookiejar.html#http.cookiejar.FileCookieJar.load) or [`revert()`](https://python-all.ru/3.1/library/http.cookiejar.html#http.cookiejar.FileCookieJar.revert) method is called. Subclasses of this class are documented in section [*FileCookieJar subclasses and co-operation with web browsers*](https://python-all.ru/3.1/library/http.cookiejar.html#file-cookie-jar-classes).4849#### `class http.cookiejar.CookiePolicy`5051Этот класс отвечает за принятие решения о том, следует ли принять каждый куки от сервера / вернуть его серверу.5253#### `class http.cookiejar.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)`5455Аргументы конструктора следует передавать только в виде именованных аргументов. *blocked\_domains* – это последовательность доменных имён, с которых мы никогда не принимаем куки и на которые не отправляем куки. *allowed\_domains*, если не равно [`None`](https://python-all.ru/3.1/library/constants.html#None), – это последовательность доменов, для которых мы принимаем и отправляем куки. Что касается всех остальных аргументов, см. документацию объектов [`CookiePolicy`](https://python-all.ru/3.1/library/http.cookiejar.html#http.cookiejar.CookiePolicy) и [`DefaultCookiePolicy`](https://python-all.ru/3.1/library/http.cookiejar.html#http.cookiejar.DefaultCookiePolicy).5657[`DefaultCookiePolicy`](https://python-all.ru/3.1/library/http.cookiejar.html#http.cookiejar.DefaultCookiePolicy) реализует стандартные правила приёма/отклонения для cookie Netscape и RFC 2965. По умолчанию cookie RFC 2109 (т.е. cookie, полученные в заголовке *Set-Cookie* с атрибутом версии, равным 1) обрабатываются по правилам RFC 2965. Однако если обработка RFC 2965 отключена или [`rfc2109_as_netscape`](https://python-all.ru/3.1/library/http.cookiejar.html#http.cookiejar.DefaultCookiePolicy.rfc2109_as_netscape) равно True, cookie RFC 2109 «понижаются» экземпляром [`CookieJar`](https://python-all.ru/3.1/library/http.cookiejar.html#http.cookiejar.CookieJar) до cookie Netscape путём установки атрибута `version` экземпляра [`Cookie`](https://python-all.ru/3.1/library/http.cookiejar.html#http.cookiejar.Cookie) в 0. [`DefaultCookiePolicy`](https://python-all.ru/3.1/library/http.cookiejar.html#http.cookiejar.DefaultCookiePolicy) также предоставляет некоторые параметры для тонкой настройки политики.5859#### `class http.cookiejar.Cookie`6061Этот класс представляет куки Netscape, RFC 2109 и RFC 2965. Не предполагается, что пользователи6263`http.cookiejar`6465будут создавать собственные экземпляры6667[`Cookie`](https://python-all.ru/3.1/library/http.cookiejar.html#http.cookiejar.Cookie)6869. Вместо этого при необходимости следует вызвать7071`make_cookies()`7273на экземпляре7475[`CookieJar`](https://python-all.ru/3.1/library/http.cookiejar.html#http.cookiejar.CookieJar)7677.7879> **См. также**80>81> **Модуль [`urllib.request`](https://python-all.ru/3.1/library/urllib.request.html#module-urllib.request)**82>83> Открытие URL с автоматической обработкой куки.84>85> **Модуль [`http.cookies`](https://python-all.ru/3.1/library/http.cookies.html#module-http.cookies)**86>87> Классы HTTP cookie, в основном полезные для серверного кода. Модули88>89> `http.cookiejar`90>91> и92>93> [`http.cookies`](https://python-all.ru/3.1/library/http.cookies.html#module-http.cookies)94>95> не зависят друг от друга.96>97> **[http://wp.netscape.com/newsref/std/cookie\_spec.html](https://python-all.ru/3.1/library/http.cookiejar.html)**98>99> Спецификация оригинального протокола Netscape cookie. Хотя это всё ещё доминирующий протокол, «протокол Netscape cookie», реализованный всеми основными браузерами (и100>101> `http.cookiejar`102>103> ), лишь отдалённо напоминает тот, что описан в104>105> `cookie_spec.html`106>107> .108>109> **[**RFC 2109**](https://python-all.ru/3.1/library/http.cookiejar.html) – Механизм управления состоянием HTTP**110>111> Заменено RFC 2965. Использует112>113> *Set-Cookie*114>115> с version=1.116>117> **[**RFC 2965**](https://python-all.ru/3.1/library/http.cookiejar.html) – Механизм управления состоянием HTTP**118>119> Протокол Netscape с исправленными ошибками. Использует120>121> *Set-Cookie2*122>123> вместо124>125> *Set-Cookie*126>127> . Широко не используется.128>129> **[http://kristol.org/cookie/errata.html](https://python-all.ru/3.1/library/http.cookiejar.html)**130>131> Незавершённые исправления к RFC 2965.132>133> [**RFC 2964**](https://python-all.ru/3.1/library/http.cookiejar.html) – Использование управления состоянием HTTP134135## 20.22.1. Объекты CookieJar и FileCookieJar136137Объекты [`CookieJar`](https://python-all.ru/3.1/library/http.cookiejar.html#http.cookiejar.CookieJar) поддерживают протокол [*итератора*](https://python-all.ru/3.1/glossary.html#term-iterator) для перебора содержащихся в них объектов [`Cookie`](https://python-all.ru/3.1/library/http.cookiejar.html#http.cookiejar.Cookie).138139[`CookieJar`](https://python-all.ru/3.1/library/http.cookiejar.html#http.cookiejar.CookieJar) имеет следующие методы:140141#### `CookieJar.add_cookie_header(request)`142143Добавляет правильный заголовок *Cookie* к *запросу*.144145Если политика позволяет (т.е. атрибуты `rfc2965` и `hide_cookie2` экземпляра [`CookieJar`](https://python-all.ru/3.1/library/http.cookiejar.html#http.cookiejar.CookieJar) [`CookiePolicy`](https://python-all.ru/3.1/library/http.cookiejar.html#http.cookiejar.CookiePolicy) равны true и false соответственно), заголовок *Cookie2* также добавляется, когда это уместно.146147Объект *request* (обычно экземпляр `urllib.request..Request`) должен поддерживать методы `get_full_url()`, `get_host()`, `get_type()`, `unverifiable()`, `get_origin_req_host()`, `has_header()`, `get_header()`, `header_items()` и `add_unredirected_header()`, как описано в [`urllib.request`](https://python-all.ru/3.1/library/urllib.request.html#module-urllib.request).148149#### `CookieJar.extract_cookies(response, request)`150151Извлекает cookies из HTTP *response* и сохраняет их в [`CookieJar`](https://python-all.ru/3.1/library/http.cookiejar.html#http.cookiejar.CookieJar), если это разрешено политикой.152153[`CookieJar`](https://python-all.ru/3.1/library/http.cookiejar.html#http.cookiejar.CookieJar) будет искать допустимые заголовки *Set-Cookie* и *Set-Cookie2* в аргументе *response*, и сохранять cookies соответствующим образом (при условии одобрения методом [`CookiePolicy.set_ok()`](https://python-all.ru/3.1/library/http.cookiejar.html#http.cookiejar.CookiePolicy.set_ok)).154155Объект *response* (обычно результат вызова [`urllib.request.urlopen()`](https://python-all.ru/3.1/library/urllib.request.html#urllib.request.urlopen) или аналогичного) должен поддерживать метод `info()`, который возвращает экземпляр [`email.message.Message`](https://python-all.ru/3.1/library/email.message.html#email.message.Message).156157Объект *request* (обычно экземпляр [`urllib.request.Request`](https://python-all.ru/3.1/library/urllib.request.html#urllib.request.Request)) должен поддерживать методы `get_full_url()`, `get_host()`, `unverifiable()` и `get_origin_req_host()`, как описано в [`urllib.request`](https://python-all.ru/3.1/library/urllib.request.html#module-urllib.request). Запрос используется для установки значений по умолчанию для атрибутов cookie, а также для проверки, разрешена ли установка cookie.158159#### `CookieJar.set_policy(policy)`160161Устанавливает экземпляр162163[`CookiePolicy`](https://python-all.ru/3.1/library/http.cookiejar.html#http.cookiejar.CookiePolicy)164165, который будет использоваться.166167#### `CookieJar.make_cookies(response, request)`168169Возвращает последовательность объектов [`Cookie`](https://python-all.ru/3.1/library/http.cookiejar.html#http.cookiejar.Cookie), извлечённых из объекта *response*.170171См. документацию [`extract_cookies()`](https://python-all.ru/3.1/library/http.cookiejar.html#http.cookiejar.CookieJar.extract_cookies) для получения интерфейсов, требуемых от аргументов *response* и *request*.172173#### `CookieJar.set_cookie_if_ok(cookie, request)`174175Устанавливает176177[`Cookie`](https://python-all.ru/3.1/library/http.cookiejar.html#http.cookiejar.Cookie)178179, если политика разрешает это сделать.180181#### `CookieJar.set_cookie(cookie)`182183Устанавливает184185[`Cookie`](https://python-all.ru/3.1/library/http.cookiejar.html#http.cookiejar.Cookie)186187, не проверяя по политике, следует ли его устанавливать.188189#### `CookieJar.clear([domain[, path[, name]]])`190191Очищает некоторые куки.192193Если вызван без аргументов, очищает все cookie. Если передан один аргумент, удаляются только cookie, принадлежащие этому *домену*. Если передано два аргумента, удаляются cookie, принадлежащие указанному *домену* и URL-*пути*. Если передано три аргумента, то удаляется cookie с указанными *доменом*, *путём* и *именем*.194195Возбуждает [`KeyError`](https://python-all.ru/3.1/library/exceptions.html#KeyError), если нет соответствующего cookie.196197#### `CookieJar.clear_session_cookies()`198199Удалить все сессионные куки.200201Отбрасывает все содержащиеся cookies, у которых атрибут `discard` имеет значение true (обычно потому, что у них не было атрибутов `max-age` или `expires`, либо был явный атрибут `discard`). Для интерактивных браузеров конец сессии обычно соответствует закрытию окна браузера.202203Обратите внимание, что метод `save()` в любом случае не сохраняет сессионные cookies, если только явно не указано иное путём передачи аргумента *ignore\_discard* со значением true.204205[`FileCookieJar`](https://python-all.ru/3.1/library/http.cookiejar.html#http.cookiejar.FileCookieJar) реализует следующие дополнительные методы:206207#### `FileCookieJar.save(filename=None, ignore_discard=False, ignore_expires=False)`208209Сохраняет куки в файл.210211Этот базовый класс возбуждает [`NotImplementedError`](https://python-all.ru/3.1/library/exceptions.html#NotImplementedError). Подклассы могут оставить этот метод нереализованным.212213*filename* – это имя файла, в который сохраняются cookies. Если *filename* не указан, используется `self.filename` (по умолчанию – значение, переданное конструктору, если оно было); если `self.filename` равно [`None`](https://python-all.ru/3.1/library/constants.html#None), возбуждается [`ValueError`](https://python-all.ru/3.1/library/exceptions.html#ValueError).214215*ignore\_discard*: сохранять даже те куки, которые помечены к удалению. *ignore\_expires*: сохранять даже куки с истекшим сроком действия.216217Файл перезаписывается, если он уже существует, тем самым удаляя все cookies, которые он содержит. Сохранённые cookies можно восстановить позже с помощью методов [`load()`](https://python-all.ru/3.1/library/http.cookiejar.html#http.cookiejar.FileCookieJar.load) или [`revert()`](https://python-all.ru/3.1/library/http.cookiejar.html#http.cookiejar.FileCookieJar.revert).218219#### `FileCookieJar.load(filename=None, ignore_discard=False, ignore_expires=False)`220221Загружает куки из файла.222223Старые куки сохраняются, если они не перезаписываются вновь загруженными.224225Аргументы такие же, как для [`save()`](https://python-all.ru/3.1/library/http.cookiejar.html#http.cookiejar.FileCookieJar.save).226227Указанный файл должен быть в формате, понятном классу, иначе будет вызвано [`LoadError`](https://python-all.ru/3.1/library/http.cookiejar.html#http.cookiejar.LoadError). Также может быть вызвано [`IOError`](https://python-all.ru/3.1/library/exceptions.html#IOError), например, если файл не существует.228229#### `FileCookieJar.revert(filename=None, ignore_discard=False, ignore_expires=False)`230231Очищает все куки и перезагружает куки из сохраненного файла.232233[`revert()`](https://python-all.ru/3.1/library/http.cookiejar.html#http.cookiejar.FileCookieJar.revert) может возбуждать те же исключения, что и [`load()`](https://python-all.ru/3.1/library/http.cookiejar.html#http.cookiejar.FileCookieJar.load). В случае ошибки состояние объекта не изменится.234235Экземпляры [`FileCookieJar`](https://python-all.ru/3.1/library/http.cookiejar.html#http.cookiejar.FileCookieJar) имеют следующие открытые атрибуты:236237#### `FileCookieJar.filename`238239Имя файла по умолчанию, в котором хранятся куки. Этому атрибуту можно присваивать значение.240241#### `FileCookieJar.delayload`242243Если True, загружает файлы cookie с диска лениво. Этому атрибуту не следует присваивать значение. Это лишь подсказка, поскольку влияет только на производительность, а не на поведение (если только файлы cookie на диске не меняются). Объект244245[`CookieJar`](https://python-all.ru/3.1/library/http.cookiejar.html#http.cookiejar.CookieJar)246247может игнорировать его. Ни один из классов248249[`FileCookieJar`](https://python-all.ru/3.1/library/http.cookiejar.html#http.cookiejar.FileCookieJar)250251, включённых в стандартную библиотеку, не загружает файлы cookie лениво.252253## 20.22.2. Подклассы FileCookieJar и взаимодействие с веб-браузерами254255Следующие подклассы [`CookieJar`](https://python-all.ru/3.1/library/http.cookiejar.html#http.cookiejar.CookieJar) предоставляются для чтения и записи.256257#### `class http.cookiejar.MozillaCookieJar(filename, delayload=None, policy=None)`258259[`FileCookieJar`](https://python-all.ru/3.1/library/http.cookiejar.html#http.cookiejar.FileCookieJar), который может загружать и сохранять файлы cookie на диск в формате `cookies.txt` браузера Mozilla (этот формат также используется браузерами Lynx и Netscape).260261> **Примечание**262>263> Это теряет информацию о файлах cookie по стандарту RFC 2965, а также о более новых или нестандартных атрибутах cookie, таких как `port`.264265> **Предупреждение**266>267> Сделайте резервную копию ваших куки перед сохранением, если у вас есть куки, потеря или повреждение которых будут нежелательны (есть некоторые тонкости, которые могут привести к небольшим изменениям в файле при полном цикле загрузки/сохранения).268269Также учтите, что куки, сохраненные во время работы Mozilla, будут перезаписаны Mozilla.270271#### `class http.cookiejar.LWPCookieJar(filename, delayload=None, policy=None)`272273[`FileCookieJar`](https://python-all.ru/3.1/library/http.cookiejar.html#http.cookiejar.FileCookieJar)274275, который может загружать и сохранять файлы cookie на диск в формате, совместимом с форматом файла276277`Set-Cookie3`278279библиотеки libwww-perl. Это удобно, если требуется хранить файлы cookie в читаемом человеком файле.280281## 20.22.3. Объекты CookiePolicy282283Объекты, реализующие интерфейс [`CookiePolicy`](https://python-all.ru/3.1/library/http.cookiejar.html#http.cookiejar.CookiePolicy), имеют следующие методы:284285#### `CookiePolicy.set_ok(cookie, request)`286287Возвращает логическое значение, указывающее, следует ли принять куки от сервера.288289*cookie* – это экземпляр [`Cookie`](https://python-all.ru/3.1/library/http.cookiejar.html#http.cookiejar.Cookie). *request* – это объект, реализующий интерфейс, определённый в документации к [`CookieJar.extract_cookies()`](https://python-all.ru/3.1/library/http.cookiejar.html#http.cookiejar.CookieJar.extract_cookies).290291#### `CookiePolicy.return_ok(cookie, request)`292293Возвращает логическое значение, указывающее, следует ли вернуть куки серверу.294295*cookie* – это экземпляр [`Cookie`](https://python-all.ru/3.1/library/http.cookiejar.html#http.cookiejar.Cookie). *request* – это объект, реализующий интерфейс, определённый в документации к [`CookieJar.add_cookie_header()`](https://python-all.ru/3.1/library/http.cookiejar.html#http.cookiejar.CookieJar.add_cookie_header).296297#### `CookiePolicy.domain_return_ok(domain, request)`298299Возвращает false, если cookie не должны быть возвращены для данного домена cookie.300301Этот метод является оптимизацией. Он устраняет необходимость проверять каждый файл cookie для определённого домена (что может потребовать чтения многих файлов). Возврат true из [`domain_return_ok()`](https://python-all.ru/3.1/library/http.cookiejar.html#http.cookiejar.CookiePolicy.domain_return_ok) и [`path_return_ok()`](https://python-all.ru/3.1/library/http.cookiejar.html#http.cookiejar.CookiePolicy.path_return_ok) оставляет всю работу на [`return_ok()`](https://python-all.ru/3.1/library/http.cookiejar.html#http.cookiejar.CookiePolicy.return_ok).302303Если [`domain_return_ok()`](https://python-all.ru/3.1/library/http.cookiejar.html#http.cookiejar.CookiePolicy.domain_return_ok) возвращает true для домена cookie, то [`path_return_ok()`](https://python-all.ru/3.1/library/http.cookiejar.html#http.cookiejar.CookiePolicy.path_return_ok) вызывается для пути cookie. В противном случае [`path_return_ok()`](https://python-all.ru/3.1/library/http.cookiejar.html#http.cookiejar.CookiePolicy.path_return_ok) и [`return_ok()`](https://python-all.ru/3.1/library/http.cookiejar.html#http.cookiejar.CookiePolicy.return_ok) никогда не вызываются для этого домена cookie. Если [`path_return_ok()`](https://python-all.ru/3.1/library/http.cookiejar.html#http.cookiejar.CookiePolicy.path_return_ok) возвращает true, то [`return_ok()`](https://python-all.ru/3.1/library/http.cookiejar.html#http.cookiejar.CookiePolicy.return_ok) вызывается с самим объектом [`Cookie`](https://python-all.ru/3.1/library/http.cookiejar.html#http.cookiejar.Cookie) для полной проверки. В противном случае [`return_ok()`](https://python-all.ru/3.1/library/http.cookiejar.html#http.cookiejar.CookiePolicy.return_ok) никогда не вызывается для этого пути cookie.304305Обратите внимание, что [`domain_return_ok()`](https://python-all.ru/3.1/library/http.cookiejar.html#http.cookiejar.CookiePolicy.domain_return_ok) вызывается для каждого домена *cookie*, а не только для домена *request*. Например, функция может быть вызвана как с `".example.com"`, так и с `"www.example.com"`, если домен запроса – `"www.example.com"`. То же самое относится к [`path_return_ok()`](https://python-all.ru/3.1/library/http.cookiejar.html#http.cookiejar.CookiePolicy.path_return_ok).306307Аргумент *request* описан в документации к [`return_ok()`](https://python-all.ru/3.1/library/http.cookiejar.html#http.cookiejar.CookiePolicy.return_ok).308309#### `CookiePolicy.path_return_ok(path, request)`310311Возвращает false, если cookie не должны быть возвращены для указанного пути cookie.312313См. документацию к [`domain_return_ok()`](https://python-all.ru/3.1/library/http.cookiejar.html#http.cookiejar.CookiePolicy.domain_return_ok).314315В дополнение к реализации вышеуказанных методов, реализации интерфейса [`CookiePolicy`](https://python-all.ru/3.1/library/http.cookiejar.html#http.cookiejar.CookiePolicy) также должны предоставлять следующие атрибуты, указывающие, какие протоколы следует использовать и как. Все эти атрибуты могут быть изменены (присвоены).316317#### `CookiePolicy.netscape`318319Реализация протокола Netscape.320321#### `CookiePolicy.rfc2965`322323Реализует протокол RFC 2965.324325#### `CookiePolicy.hide_cookie2`326327Не добавлять заголовок328329*Cookie2*330331к запросам (наличие этого заголовка указывает серверу на то, что мы понимаем куки RFC 2965).332333Самый удобный способ определить класс [`CookiePolicy`](https://python-all.ru/3.1/library/http.cookiejar.html#http.cookiejar.CookiePolicy) – создать подкласс [`DefaultCookiePolicy`](https://python-all.ru/3.1/library/http.cookiejar.html#http.cookiejar.DefaultCookiePolicy) и переопределить некоторые или все методы, описанные выше. Сам [`CookiePolicy`](https://python-all.ru/3.1/library/http.cookiejar.html#http.cookiejar.CookiePolicy) можно использовать как «нулевую политику», разрешающую устанавливать и получать любые файлы cookie (вряд ли это будет полезно).334335## 20.22.4. Объекты DefaultCookiePolicy336337Реализует стандартные правила принятия и возврата куки.338339Охватываются как куки RFC 2965, так и Netscape. Обработка RFC 2965 отключена по умолчанию.340341Самый простой способ создать свою политику – переопределить этот класс и вызывать его методы в ваших переопределённых реализациях перед добавлением собственных дополнительных проверок:342343```python344import http.cookiejar345class MyCookiePolicy(http.cookiejar.DefaultCookiePolicy):346 def set_ok(self, cookie, request):347 if not http.cookiejar.DefaultCookiePolicy.set_ok(self, cookie, request):348 return False349 if i_dont_want_to_store_this_cookie(cookie):350 return False351 return True352```353354В дополнение к функциям, необходимым для реализации интерфейса [`CookiePolicy`](https://python-all.ru/3.1/library/http.cookiejar.html#http.cookiejar.CookiePolicy), этот класс позволяет запрещать или разрешать доменам устанавливать и получать файлы cookie. Также имеются переключатели строгости, позволяющие немного ужесточить довольно свободные правила протокола Netscape (ценой блокировки некоторых безобидных файлов cookie).355356Предоставляются чёрный и белый списки доменов (оба отключены по умолчанию). Только домены, не входящие в чёрный список и присутствующие в белом списке (если белый список активен), участвуют в установке и возврате файлов cookie. Используйте аргумент конструктора *blocked\_domains* и методы `blocked_domains()` и `set_blocked_domains()` (а также соответствующий аргумент и методы для *allowed\_domains*). Если задан белый список, его можно отключить, установив значение [`None`](https://python-all.ru/3.1/library/constants.html#None).357358Домены в списках блокировки или разрешения, которые не начинаются с точки, должны в точности совпадать с доменом 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 – нет.359360[`DefaultCookiePolicy`](https://python-all.ru/3.1/library/http.cookiejar.html#http.cookiejar.DefaultCookiePolicy) реализует следующие дополнительные методы:361362#### `DefaultCookiePolicy.blocked_domains()`363364Возвращает последовательность заблокированных доменов (в виде кортежа).365366#### `DefaultCookiePolicy.set_blocked_domains(blocked_domains)`367368Устанавливает последовательность заблокированных доменов.369370#### `DefaultCookiePolicy.is_blocked(domain)`371372Возвращает, находится ли373374*domain*375376в чёрном списке для установки или получения куки.377378#### `DefaultCookiePolicy.allowed_domains()`379380Возвращает381382[`None`](https://python-all.ru/3.1/library/constants.html#None)383384или последовательность разрешённых доменов (в виде кортежа).385386#### `DefaultCookiePolicy.set_allowed_domains(allowed_domains)`387388Устанавливает последовательность разрешённых доменов или389390[`None`](https://python-all.ru/3.1/library/constants.html#None)391392.393394#### `DefaultCookiePolicy.is_not_allowed(domain)`395396Возвращает, не находится ли397398*domain*399400в белом списке для установки или получения куки.401402[`DefaultCookiePolicy`](https://python-all.ru/3.1/library/http.cookiejar.html#http.cookiejar.DefaultCookiePolicy) экземпляры имеют следующие атрибуты, которые все инициализируются из одноимённых аргументов конструктора и которым можно присваивать значения.403404#### `DefaultCookiePolicy.rfc2109_as_netscape`405406Если true, запрашивает, чтобы экземпляр407408[`CookieJar`](https://python-all.ru/3.1/library/http.cookiejar.html#http.cookiejar.CookieJar)409410понижал версию файлов cookie RFC 2109 (т.е. файлы cookie, полученные в заголовке411412*Set-Cookie*413414с атрибутом версии cookie-attribute, равным 1) до файлов cookie Netscape, устанавливая атрибут версии экземпляра415416[`Cookie`](https://python-all.ru/3.1/library/http.cookiejar.html#http.cookiejar.Cookie)417418в 0. Значение по умолчанию –419420[`None`](https://python-all.ru/3.1/library/constants.html#None)421422, в этом случае файлы cookie RFC 2109 понижаются тогда и только тогда, когда обработка RFC 2965 отключена. Поэтому по умолчанию файлы cookie RFC 2109 понижаются.423424Общие переключатели строгости:425426#### `DefaultCookiePolicy.strict_domain`427428Не разрешает сайтам устанавливать двухкомпонентные домены с национальными доменами верхнего уровня, такими как429430`.co.uk`431432,433434`.gov.uk`435436,437438`.co.nz`439440и т.д. Это далеко от совершенства и не гарантирует работы!441442Переключатели строгости протокола RFC 2965:443444#### `DefaultCookiePolicy.strict_rfc2965_unverifiable`445446Следовать правилам RFC 2965 для непроверяемых транзакций (обычно непроверяемая транзакция возникает в результате перенаправления или запроса изображения, размещённого на другом сайте). Если это False, куки447448*никогда*449450не блокируются на основе проверяемости.451452Переключатели строгости протокола Netscape:453454#### `DefaultCookiePolicy.strict_ns_unverifiable`455456Применять правила RFC 2965 для непроверяемых транзакций также к куки Netscape.457458#### `DefaultCookiePolicy.strict_ns_domain`459460Флаги, указывающие, насколько строгими должны быть правила сопоставления доменов для cookies Netscape. Допустимые значения приведены ниже.461462#### `DefaultCookiePolicy.strict_ns_set_initial_dollar`463464Игнорирует cookies в заголовках Set-Cookie, имена которых начинаются с465466`'$'`467468.469470#### `DefaultCookiePolicy.strict_ns_set_path`471472Не разрешать установку куки, путь которых не соответствует URI запроса.473474`strict_ns_domain` – это набор флагов. Его значение формируется путём логического ИЛИ (например, `DomainStrictNoDots|DomainStrictNonDomain` означает, что установлены оба флага).475476#### `DefaultCookiePolicy.DomainStrictNoDots`477478При установке файлов cookie «префикс хоста» не должен содержать точку (например,479480`www.foo.bar.com`481482не может установить файл cookie для483484`.bar.com`485486, потому что487488`www.foo`489490содержит точку).491492#### `DefaultCookiePolicy.DomainStrictNonDomain`493494Файлы cookie, которые не указали явно атрибут495496`domain`497498cookie-attribute, могут быть возвращены только домену, равному домену, установившему cookie (например,499500`spam.example.com`501502не будут возвращены файлы cookie от503504`example.com`505506, у которых не было507508`domain`509510cookie-attribute).511512#### `DefaultCookiePolicy.DomainRFC2965Match`513514При установке куки требовать полного соответствия домена по RFC 2965.515516Следующие атрибуты предоставлены для удобства и представляют собой наиболее полезные комбинации указанных выше флагов:517518#### `DefaultCookiePolicy.DomainLiberal`519520Эквивалентно 0 (то есть все указанные выше флаги строгости домена Netscape отключены).521522#### `DefaultCookiePolicy.DomainStrict`523524Эквивалентно525526`DomainStrictNoDots|DomainStrictNonDomain`527528.529530## 20.22.5. Объекты Cookie531532[`Cookie`](https://python-all.ru/3.1/library/http.cookiejar.html#http.cookiejar.Cookie) имеют атрибуты Python, примерно соответствующие стандартным атрибутам cookie, определённым в различных стандартах cookie. Соответствие не является взаимно однозначным, так как есть сложные правила присвоения значений по умолчанию, потому что `max-age` и `expires` содержат эквивалентную информацию, и потому что RFC 2109 cookie могут быть «понижены» с помощью `http.cookiejar` с версии 1 до версии 0 (Netscape) cookie.533534Присваивание значения этим атрибутам не должно требоваться, за исключением редких случаев в методе [`CookiePolicy`](https://python-all.ru/3.1/library/http.cookiejar.html#http.cookiejar.CookiePolicy). Класс не обеспечивает внутреннюю согласованность, поэтому следует понимать, что делаешь, если это делать.535536#### `Cookie.version`537538Целое число или539540[`None`](https://python-all.ru/3.1/library/constants.html#None)541542. У Netscape-куки значение543544[`version`](https://python-all.ru/3.1/library/http.cookiejar.html#http.cookiejar.Cookie.version)545546равно 0. У куки RFC 2965 и RFC 2109 значение атрибута547548`version`549550равно 1. Однако обратите внимание, что551552`http.cookiejar`553554может «понизить» RFC 2109 куки до Netscape-куки, и в этом случае555556[`version`](https://python-all.ru/3.1/library/http.cookiejar.html#http.cookiejar.Cookie.version)557558будет равно 0.559560#### `Cookie.name`561562Имя cookie (строка).563564#### `Cookie.value`565566Значение cookie (строка) или567568[`None`](https://python-all.ru/3.1/library/constants.html#None)569570.571572#### `Cookie.port`573574Строка, представляющая порт или набор портов (например, ‘80’ или ‘80,8080’), или575576[`None`](https://python-all.ru/3.1/library/constants.html#None)577578.579580#### `Cookie.path`581582Путь к cookie (строка, например583584`'/acme/rocket_launchers'`585586).587588#### `Cookie.secure`589590True, если cookie должен возвращаться только через защищённое соединение.591592#### `Cookie.expires`593594Целое число – дата истечения в секундах от начала эпохи, или595596[`None`](https://python-all.ru/3.1/library/constants.html#None)597598. См. также метод599600[`is_expired()`](https://python-all.ru/3.1/library/http.cookiejar.html#http.cookiejar.Cookie.is_expired)601602.603604#### `Cookie.discard`605606True, если это сессионный cookie.607608#### `Cookie.comment`609610Строковый комментарий от сервера, поясняющий назначение этого cookie, или611612[`None`](https://python-all.ru/3.1/library/constants.html#None)613614.615616#### `Cookie.comment_url`617618URL, указывающий на комментарий от сервера с пояснением назначения этого cookie, или619620[`None`](https://python-all.ru/3.1/library/constants.html#None)621622.623624#### `Cookie.rfc2109`625626True, если эта куки была получена как RFC 2109 куки (т.е. куки пришла в заголовке627628*Set-Cookie*629630, и значение атрибута Version в этом заголовке было равно 1). Этот атрибут предоставлен, потому что631632`http.cookiejar`633634может «понизить» RFC 2109 куки до Netscape-куки, и в этом случае635636[`version`](https://python-all.ru/3.1/library/http.cookiejar.html#http.cookiejar.Cookie.version)637638будет равно 0.639640#### `Cookie.port_specified`641642True, если порт или набор портов был явно указан сервером (в643644*Set-Cookie*645646/647648*Set-Cookie2*649650заголовке).651652#### `Cookie.domain_specified`653654True, если домен был явно указан сервером.655656#### `Cookie.domain_initial_dot`657658True, если домен, явно указанный сервером, начинался с точки (659660`'.'`661662).663664Cookie могут иметь дополнительные нестандартные атрибуты cookie. Доступ к ним можно получить с помощью следующих методов:665666#### `Cookie.has_nonstandard_attr(name)`667668Возвращает true, если cookie имеет атрибут с указанным именем.669670#### `Cookie.get_nonstandard_attr(name, default=None)`671672Если cookie имеет указанный атрибут cookie, возвращает его значение. В противном случае возвращает673674*default*675676.677678#### `Cookie.set_nonstandard_attr(name, value)`679680Устанавливает значение указанного атрибута cookie.681682Класс [`Cookie`](https://python-all.ru/3.1/library/http.cookiejar.html#http.cookiejar.Cookie) также определяет следующий метод:683684#### `Cookie.is_expired([now=None])`685686True, если прошло время, когда сервер запросил истечение cookie. Если687688*now*689690задан (в секундах от начала эпохи), возвращает, истёк ли cookie на указанный момент.691692## 20.22.6. Примеры693694Первый пример показывает наиболее частое использование `http.cookiejar`:695696```python697import http.cookiejar, urllib.request698cj = http.cookiejar.CookieJar()699opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj))700r = opener.open("http://example.com/")701```702703Этот пример иллюстрирует, как открыть URL с использованием ваших куки Netscape, Mozilla или Lynx (предполагается соглашение Unix/Netscape о местоположении файла куки):704705```python706import os, http.cookiejar, urllib.request707cj = http.cookiejar.MozillaCookieJar()708cj.load(os.path.join(os.path.expanduser("~"), ".netscape", "cookies.txt"))709opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj))710r = opener.open("http://example.com/")711```712713Следующий пример иллюстрирует использование [`DefaultCookiePolicy`](https://python-all.ru/3.1/library/http.cookiejar.html#http.cookiejar.DefaultCookiePolicy). Включите cookies по RFC 2965, ужесточите правила для доменов при установке и возврате cookies Netscape, а также заблокируйте возможность установки или возврата cookies для некоторых доменов:714715```python716import urllib.request717from http.cookiejar import CookieJar, DefaultCookiePolicy718policy = DefaultCookiePolicy(719 rfc2965=True, strict_ns_domain=Policy.DomainStrict,720 blocked_domains=["ads.net", ".ads.net"])721cj = CookieJar(policy)722opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj))723r = opener.open("http://example.com/")724```725