http.cookiejar.md
1> **Источник:** https://python-all.ru/3.0/library/http.cookiejar.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# `http.cookiejar` – управление куки для HTTP-клиентов89Модуль `http.cookiejar` определяет классы для автоматической обработки HTTP-куки. Он полезен для доступа к веб-сайтам, которые требуют, чтобы небольшие фрагменты данных – *куки* – были установлены на клиентской машине HTTP-ответом от веб-сервера, а затем возвращены серверу в последующих HTTP-запросах.1011Обрабатываются как обычный протокол Netscape cookie, так и протокол, определённый в [**RFC 2965**](https://python-all.ru/3.0/library/http.cookiejar.html). Обработка RFC 2965 по умолчанию отключена. [**RFC 2109**](https://python-all.ru/3.0/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#### `[http.cookiejar.LoadError]exception http.cookiejar.LoadError`2021Экземпляры2223[`FileCookieJar`](https://python-all.ru/3.0/library/http.cookiejar.html#http.cookiejar.FileCookieJar)2425вызывают это исключение при сбое загрузки куки из файла.2627[`LoadError`](https://python-all.ru/3.0/library/http.cookiejar.html#http.cookiejar.LoadError)2829является подклассом3031[`IOError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.IOError)3233.3435Предоставляются следующие классы:3637#### `[http.cookiejar.CookieJar]class http.cookiejar.CookieJar(policy=None)`3839*policy* – это объект, реализующий интерфейс [`CookiePolicy`](https://python-all.ru/3.0/library/http.cookiejar.html#http.cookiejar.CookiePolicy).4041The [`CookieJar`](https://python-all.ru/3.0/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.0/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#### `[http.cookiejar.FileCookieJar]class http.cookiejar.FileCookieJar(filename, delayload=None, policy=None)`4445*policy* – это объект, реализующий интерфейс [`CookiePolicy`](https://python-all.ru/3.0/library/http.cookiejar.html#http.cookiejar.CookiePolicy). Остальные аргументы описаны в документации соответствующих атрибутов.4647A [`CookieJar`](https://python-all.ru/3.0/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.0/library/http.cookiejar.html#http.cookiejar.FileCookieJar.load) or [`revert()`](https://python-all.ru/3.0/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.0/library/http.cookiejar.html#file-cookie-jar-classes).4849#### `[http.cookiejar.CookiePolicy]class http.cookiejar.CookiePolicy`5051Этот класс отвечает за принятие решения о том, следует ли принять каждый куки от сервера / вернуть его серверу.5253#### `[http.cookiejar.DefaultCookiePolicy]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.0/library/constants.html#None), – это последовательность доменов, для которых мы принимаем и отправляем куки. Что касается всех остальных аргументов, см. документацию объектов [`CookiePolicy`](https://python-all.ru/3.0/library/http.cookiejar.html#http.cookiejar.CookiePolicy) и [`DefaultCookiePolicy`](https://python-all.ru/3.0/library/http.cookiejar.html#http.cookiejar.DefaultCookiePolicy).5657[`DefaultCookiePolicy`](https://python-all.ru/3.0/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.0/library/http.cookiejar.html#http.cookiejar.DefaultCookiePolicy.rfc2109_as_netscape) равно True, cookie RFC 2109 «понижаются» экземпляром [`CookieJar`](https://python-all.ru/3.0/library/http.cookiejar.html#http.cookiejar.CookieJar) до cookie Netscape путём установки атрибута `version` экземпляра [`Cookie`](https://python-all.ru/3.0/library/http.cookiejar.html#http.cookiejar.Cookie) в 0. [`DefaultCookiePolicy`](https://python-all.ru/3.0/library/http.cookiejar.html#http.cookiejar.DefaultCookiePolicy) также предоставляет некоторые параметры для тонкой настройки политики.5859#### `[http.cookiejar.Cookie]class http.cookiejar.Cookie`6061Этот класс представляет куки Netscape, RFC 2109 и RFC 2965. Не предполагается, что пользователи6263`http.cookiejar`6465будут создавать собственные экземпляры6667[`Cookie`](https://python-all.ru/3.0/library/http.cookiejar.html#http.cookiejar.Cookie)6869. Вместо этого при необходимости следует вызвать7071`make_cookies()`7273на экземпляре7475[`CookieJar`](https://python-all.ru/3.0/library/http.cookiejar.html#http.cookiejar.CookieJar)7677.7879> **См. также**80>81> **Модуль [`urllib.request`](https://python-all.ru/3.0/library/urllib.request.html#module-urllib.request)**82>83> Открытие URL с автоматической обработкой куки.84>85> **Модуль [`http.cookies`](https://python-all.ru/3.0/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.0/library/http.cookies.html#module-http.cookies)94>95> не зависят друг от друга.96>97> **[http://wwwsearch.sf.net/ClientCookie/](https://python-all.ru/3.0/library/http.cookiejar.html)**98>99> Расширения этого модуля, включая класс для чтения куки Microsoft Internet Explorer в Windows.100>101> **[http://wp.netscape.com/newsref/std/cookie\_spec.html](https://python-all.ru/3.0/library/http.cookiejar.html)**102>103> Спецификация оригинального протокола Netscape cookie. Хотя это всё ещё доминирующий протокол, «протокол Netscape cookie», реализованный всеми основными браузерами (и104>105> `http.cookiejar`106>107> ), лишь отдалённо напоминает тот, что описан в108>109> `cookie_spec.html`110>111> .112>113> **[**RFC 2109**](https://python-all.ru/3.0/library/http.cookiejar.html) – Механизм управления состоянием HTTP**114>115> Заменено RFC 2965. Использует116>117> *Set-Cookie*118>119> с version=1.120>121> **[**RFC 2965**](https://python-all.ru/3.0/library/http.cookiejar.html) – Механизм управления состоянием HTTP**122>123> Протокол Netscape с исправленными ошибками. Использует124>125> *Set-Cookie2*126>127> вместо128>129> *Set-Cookie*130>131> . Широко не используется.132>133> **[http://kristol.org/cookie/errata.html](https://python-all.ru/3.0/library/http.cookiejar.html)**134>135> Незавершённые исправления к RFC 2965.136>137> [**RFC 2964**](https://python-all.ru/3.0/library/http.cookiejar.html) – Использование управления состоянием HTTP138139## Объекты CookieJar и FileCookieJar140141Объекты [`CookieJar`](https://python-all.ru/3.0/library/http.cookiejar.html#http.cookiejar.CookieJar) поддерживают протокол [*итератора*](https://python-all.ru/3.0/glossary.html#term-iterator) для перебора содержащихся в них объектов [`Cookie`](https://python-all.ru/3.0/library/http.cookiejar.html#http.cookiejar.Cookie).142143[`CookieJar`](https://python-all.ru/3.0/library/http.cookiejar.html#http.cookiejar.CookieJar) имеет следующие методы:144145#### `[http.cookiejar.CookieJar.add_cookie_header]CookieJar.add_cookie_header(request)`146147Добавляет правильный заголовок *Cookie* к *запросу*.148149Если политика позволяет (т.е. атрибуты `rfc2965` и `hide_cookie2` экземпляра [`CookieJar`](https://python-all.ru/3.0/library/http.cookiejar.html#http.cookiejar.CookieJar) [`CookiePolicy`](https://python-all.ru/3.0/library/http.cookiejar.html#http.cookiejar.CookiePolicy) равны true и false соответственно), заголовок *Cookie2* также добавляется, когда это уместно.150151Объект *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.0/library/urllib.request.html#module-urllib.request).152153#### `[http.cookiejar.CookieJar.extract_cookies]CookieJar.extract_cookies(response, request)`154155Извлекает cookies из HTTP *response* и сохраняет их в [`CookieJar`](https://python-all.ru/3.0/library/http.cookiejar.html#http.cookiejar.CookieJar), если это разрешено политикой.156157[`CookieJar`](https://python-all.ru/3.0/library/http.cookiejar.html#http.cookiejar.CookieJar) будет искать допустимые заголовки *Set-Cookie* и *Set-Cookie2* в аргументе *response*, и сохранять cookies соответствующим образом (при условии одобрения методом [`CookiePolicy.set_ok()`](https://python-all.ru/3.0/library/http.cookiejar.html#http.cookiejar.CookiePolicy.set_ok)).158159Объект *response* (обычно результат вызова [`urllib.request.urlopen()`](https://python-all.ru/3.0/library/urllib.request.html#urllib.request.urlopen) или аналогичного) должен поддерживать метод `info()`, который возвращает экземпляр [`email.message.Message`](https://python-all.ru/3.0/library/email.message.html#email.message.Message).160161Объект *request* (обычно экземпляр [`urllib.request.Request`](https://python-all.ru/3.0/library/urllib.request.html#urllib.request.Request)) должен поддерживать методы `get_full_url()`, `get_host()`, `unverifiable()` и `get_origin_req_host()`, как описано в [`urllib.request`](https://python-all.ru/3.0/library/urllib.request.html#module-urllib.request). Запрос используется для установки значений по умолчанию для атрибутов cookie, а также для проверки, разрешена ли установка cookie.162163#### `[http.cookiejar.CookieJar.set_policy]CookieJar.set_policy(policy)`164165Устанавливает экземпляр166167[`CookiePolicy`](https://python-all.ru/3.0/library/http.cookiejar.html#http.cookiejar.CookiePolicy)168169, который будет использоваться.170171#### `[http.cookiejar.CookieJar.make_cookies]CookieJar.make_cookies(response, request)`172173Возвращает последовательность объектов [`Cookie`](https://python-all.ru/3.0/library/http.cookiejar.html#http.cookiejar.Cookie), извлечённых из объекта *response*.174175См. документацию [`extract_cookies()`](https://python-all.ru/3.0/library/http.cookiejar.html#http.cookiejar.CookieJar.extract_cookies) для получения интерфейсов, требуемых от аргументов *response* и *request*.176177#### `[http.cookiejar.CookieJar.set_cookie_if_ok]CookieJar.set_cookie_if_ok(cookie, request)`178179Устанавливает180181[`Cookie`](https://python-all.ru/3.0/library/http.cookiejar.html#http.cookiejar.Cookie)182183, если политика разрешает это сделать.184185#### `[http.cookiejar.CookieJar.set_cookie]CookieJar.set_cookie(cookie)`186187Устанавливает188189[`Cookie`](https://python-all.ru/3.0/library/http.cookiejar.html#http.cookiejar.Cookie)190191, не проверяя по политике, следует ли его устанавливать.192193#### `[http.cookiejar.CookieJar.clear]CookieJar.clear([domain[, path[, name]]])`194195Очищает некоторые куки.196197Если вызван без аргументов, очищает все cookie. Если передан один аргумент, удаляются только cookie, принадлежащие этому *домену*. Если передано два аргумента, удаляются cookie, принадлежащие указанному *домену* и URL-*пути*. Если передано три аргумента, то удаляется cookie с указанными *доменом*, *путём* и *именем*.198199Возбуждает [`KeyError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.KeyError), если нет соответствующего cookie.200201#### `[http.cookiejar.CookieJar.clear_session_cookies]CookieJar.clear_session_cookies()`202203Удалить все сессионные куки.204205Отбрасывает все содержащиеся cookies, у которых атрибут `discard` имеет значение true (обычно потому, что у них не было атрибутов `max-age` или `expires`, либо был явный атрибут `discard`). Для интерактивных браузеров конец сессии обычно соответствует закрытию окна браузера.206207Обратите внимание, что метод `save()` в любом случае не сохраняет сессионные cookies, если только явно не указано иное путём передачи аргумента *ignore\_discard* со значением true.208209[`FileCookieJar`](https://python-all.ru/3.0/library/http.cookiejar.html#http.cookiejar.FileCookieJar) реализует следующие дополнительные методы:210211#### `[http.cookiejar.FileCookieJar.save]FileCookieJar.save(filename=None, ignore_discard=False, ignore_expires=False)`212213Сохраняет куки в файл.214215Этот базовый класс возбуждает [`NotImplementedError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.NotImplementedError). Подклассы могут оставить этот метод нереализованным.216217*filename* – это имя файла, в который сохраняются cookies. Если *filename* не указан, используется `self.filename` (по умолчанию – значение, переданное конструктору, если оно было); если `self.filename` равно [`None`](https://python-all.ru/3.0/library/constants.html#None), возбуждается [`ValueError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.ValueError).218219*ignore\_discard*: сохранять даже те куки, которые помечены к удалению. *ignore\_expires*: сохранять даже куки с истекшим сроком действия.220221Файл перезаписывается, если он уже существует, тем самым удаляя все cookies, которые он содержит. Сохранённые cookies можно восстановить позже с помощью методов [`load()`](https://python-all.ru/3.0/library/http.cookiejar.html#http.cookiejar.FileCookieJar.load) или [`revert()`](https://python-all.ru/3.0/library/http.cookiejar.html#http.cookiejar.FileCookieJar.revert).222223#### `[http.cookiejar.FileCookieJar.load]FileCookieJar.load(filename=None, ignore_discard=False, ignore_expires=False)`224225Загружает куки из файла.226227Старые куки сохраняются, если они не перезаписываются вновь загруженными.228229Аргументы такие же, как для [`save()`](https://python-all.ru/3.0/library/http.cookiejar.html#http.cookiejar.FileCookieJar.save).230231Указанный файл должен быть в формате, понятном классу, иначе будет вызвано [`LoadError`](https://python-all.ru/3.0/library/http.cookiejar.html#http.cookiejar.LoadError). Также может быть вызвано [`IOError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.IOError), например, если файл не существует.232233#### `[http.cookiejar.FileCookieJar.revert]FileCookieJar.revert(filename=None, ignore_discard=False, ignore_expires=False)`234235Очищает все куки и перезагружает куки из сохраненного файла.236237[`revert()`](https://python-all.ru/3.0/library/http.cookiejar.html#http.cookiejar.FileCookieJar.revert) может возбуждать те же исключения, что и [`load()`](https://python-all.ru/3.0/library/http.cookiejar.html#http.cookiejar.FileCookieJar.load). В случае ошибки состояние объекта не изменится.238239Экземпляры [`FileCookieJar`](https://python-all.ru/3.0/library/http.cookiejar.html#http.cookiejar.FileCookieJar) имеют следующие открытые атрибуты:240241#### `[http.cookiejar.FileCookieJar.filename]FileCookieJar.filename`242243Имя файла по умолчанию, в котором хранятся куки. Этому атрибуту можно присваивать значение.244245#### `[http.cookiejar.FileCookieJar.delayload]FileCookieJar.delayload`246247Если True, загружает файлы cookie с диска лениво. Этому атрибуту не следует присваивать значение. Это лишь подсказка, поскольку влияет только на производительность, а не на поведение (если только файлы cookie на диске не меняются). Объект248249[`CookieJar`](https://python-all.ru/3.0/library/http.cookiejar.html#http.cookiejar.CookieJar)250251может игнорировать его. Ни один из классов252253[`FileCookieJar`](https://python-all.ru/3.0/library/http.cookiejar.html#http.cookiejar.FileCookieJar)254255, включённых в стандартную библиотеку, не загружает файлы cookie лениво.256257## Подклассы FileCookieJar и взаимодействие с веб-браузерами258259The following [`CookieJar`](https://python-all.ru/3.0/library/http.cookiejar.html#http.cookiejar.CookieJar) subclasses are provided for reading and writing . Further [`CookieJar`](https://python-all.ru/3.0/library/http.cookiejar.html#http.cookiejar.CookieJar) subclasses, including one that reads Microsoft Internet Explorer cookies, are available at [http://wwwsearch.sf.net/ClientCookie/](https://python-all.ru/3.0/library/http.cookiejar.html).260261#### `[http.cookiejar.MozillaCookieJar]class http.cookiejar.MozillaCookieJar(filename, delayload=None, policy=None)`262263[`FileCookieJar`](https://python-all.ru/3.0/library/http.cookiejar.html#http.cookiejar.FileCookieJar), который может загружать и сохранять файлы cookie на диск в формате `cookies.txt` браузера Mozilla (этот формат также используется браузерами Lynx и Netscape).264265> **Примечание**266>267> Это теряет информацию о файлах cookie по стандарту RFC 2965, а также о более новых или нестандартных атрибутах cookie, таких как `port`.268269> **Предупреждение**270>271> Сделайте резервную копию ваших куки перед сохранением, если у вас есть куки, потеря или повреждение которых будут нежелательны (есть некоторые тонкости, которые могут привести к небольшим изменениям в файле при полном цикле загрузки/сохранения).272273Также учтите, что куки, сохраненные во время работы Mozilla, будут перезаписаны Mozilla.274275#### `[http.cookiejar.LWPCookieJar]class http.cookiejar.LWPCookieJar(filename, delayload=None, policy=None)`276277[`FileCookieJar`](https://python-all.ru/3.0/library/http.cookiejar.html#http.cookiejar.FileCookieJar)278279, который может загружать и сохранять файлы cookie на диск в формате, совместимом с форматом файла280281`Set-Cookie3`282283библиотеки libwww-perl. Это удобно, если требуется хранить файлы cookie в читаемом человеком файле.284285## Объекты CookiePolicy286287Объекты, реализующие интерфейс [`CookiePolicy`](https://python-all.ru/3.0/library/http.cookiejar.html#http.cookiejar.CookiePolicy), имеют следующие методы:288289#### `[http.cookiejar.CookiePolicy.set_ok]CookiePolicy.set_ok(cookie, request)`290291Возвращает логическое значение, указывающее, следует ли принять куки от сервера.292293*cookie* – это экземпляр [`Cookie`](https://python-all.ru/3.0/library/http.cookiejar.html#http.cookiejar.Cookie). *request* – это объект, реализующий интерфейс, определённый в документации к [`CookieJar.extract_cookies()`](https://python-all.ru/3.0/library/http.cookiejar.html#http.cookiejar.CookieJar.extract_cookies).294295#### `[http.cookiejar.CookiePolicy.return_ok]CookiePolicy.return_ok(cookie, request)`296297Возвращает логическое значение, указывающее, следует ли вернуть куки серверу.298299*cookie* – это экземпляр [`Cookie`](https://python-all.ru/3.0/library/http.cookiejar.html#http.cookiejar.Cookie). *request* – это объект, реализующий интерфейс, определённый в документации к [`CookieJar.add_cookie_header()`](https://python-all.ru/3.0/library/http.cookiejar.html#http.cookiejar.CookieJar.add_cookie_header).300301#### `[http.cookiejar.CookiePolicy.domain_return_ok]CookiePolicy.domain_return_ok(domain, request)`302303Возвращает false, если cookie не должны быть возвращены для данного домена cookie.304305Этот метод является оптимизацией. Он устраняет необходимость проверять каждый файл cookie для определённого домена (что может потребовать чтения многих файлов). Возврат true из [`domain_return_ok()`](https://python-all.ru/3.0/library/http.cookiejar.html#http.cookiejar.CookiePolicy.domain_return_ok) и [`path_return_ok()`](https://python-all.ru/3.0/library/http.cookiejar.html#http.cookiejar.CookiePolicy.path_return_ok) оставляет всю работу на [`return_ok()`](https://python-all.ru/3.0/library/http.cookiejar.html#http.cookiejar.CookiePolicy.return_ok).306307Если [`domain_return_ok()`](https://python-all.ru/3.0/library/http.cookiejar.html#http.cookiejar.CookiePolicy.domain_return_ok) возвращает true для домена cookie, то [`path_return_ok()`](https://python-all.ru/3.0/library/http.cookiejar.html#http.cookiejar.CookiePolicy.path_return_ok) вызывается для пути cookie. В противном случае [`path_return_ok()`](https://python-all.ru/3.0/library/http.cookiejar.html#http.cookiejar.CookiePolicy.path_return_ok) и [`return_ok()`](https://python-all.ru/3.0/library/http.cookiejar.html#http.cookiejar.CookiePolicy.return_ok) никогда не вызываются для этого домена cookie. Если [`path_return_ok()`](https://python-all.ru/3.0/library/http.cookiejar.html#http.cookiejar.CookiePolicy.path_return_ok) возвращает true, то [`return_ok()`](https://python-all.ru/3.0/library/http.cookiejar.html#http.cookiejar.CookiePolicy.return_ok) вызывается с самим объектом [`Cookie`](https://python-all.ru/3.0/library/http.cookiejar.html#http.cookiejar.Cookie) для полной проверки. В противном случае [`return_ok()`](https://python-all.ru/3.0/library/http.cookiejar.html#http.cookiejar.CookiePolicy.return_ok) никогда не вызывается для этого пути cookie.308309Обратите внимание, что [`domain_return_ok()`](https://python-all.ru/3.0/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.0/library/http.cookiejar.html#http.cookiejar.CookiePolicy.path_return_ok).310311Аргумент *request* описан в документации к [`return_ok()`](https://python-all.ru/3.0/library/http.cookiejar.html#http.cookiejar.CookiePolicy.return_ok).312313#### `[http.cookiejar.CookiePolicy.path_return_ok]CookiePolicy.path_return_ok(path, request)`314315Возвращает false, если cookie не должны быть возвращены для указанного пути cookie.316317См. документацию к [`domain_return_ok()`](https://python-all.ru/3.0/library/http.cookiejar.html#http.cookiejar.CookiePolicy.domain_return_ok).318319В дополнение к реализации вышеуказанных методов, реализации интерфейса [`CookiePolicy`](https://python-all.ru/3.0/library/http.cookiejar.html#http.cookiejar.CookiePolicy) также должны предоставлять следующие атрибуты, указывающие, какие протоколы следует использовать и как. Все эти атрибуты могут быть изменены (присвоены).320321#### `[http.cookiejar.CookiePolicy.netscape]CookiePolicy.netscape`322323Реализация протокола Netscape.324325#### `[http.cookiejar.CookiePolicy.rfc2965]CookiePolicy.rfc2965`326327Реализует протокол RFC 2965.328329#### `[http.cookiejar.CookiePolicy.hide_cookie2]CookiePolicy.hide_cookie2`330331Не добавлять заголовок332333*Cookie2*334335к запросам (наличие этого заголовка указывает серверу на то, что мы понимаем куки RFC 2965).336337Самый удобный способ определить класс [`CookiePolicy`](https://python-all.ru/3.0/library/http.cookiejar.html#http.cookiejar.CookiePolicy) – создать подкласс [`DefaultCookiePolicy`](https://python-all.ru/3.0/library/http.cookiejar.html#http.cookiejar.DefaultCookiePolicy) и переопределить некоторые или все методы, описанные выше. Сам [`CookiePolicy`](https://python-all.ru/3.0/library/http.cookiejar.html#http.cookiejar.CookiePolicy) можно использовать как «нулевую политику», разрешающую устанавливать и получать любые файлы cookie (вряд ли это будет полезно).338339## Объекты DefaultCookiePolicy340341Реализует стандартные правила принятия и возврата куки.342343Охватываются как куки RFC 2965, так и Netscape. Обработка RFC 2965 отключена по умолчанию.344345Самый простой способ создать свою политику – переопределить этот класс и вызывать его методы в ваших переопределённых реализациях перед добавлением собственных дополнительных проверок:346347```python348import http.cookiejar349class MyCookiePolicy(http.cookiejar.DefaultCookiePolicy):350 def set_ok(self, cookie, request):351 if not http.cookiejar.DefaultCookiePolicy.set_ok(self, cookie, request):352 return False353 if i_dont_want_to_store_this_cookie(cookie):354 return False355 return True356```357358В дополнение к функциям, необходимым для реализации интерфейса [`CookiePolicy`](https://python-all.ru/3.0/library/http.cookiejar.html#http.cookiejar.CookiePolicy), этот класс позволяет запрещать или разрешать доменам устанавливать и получать файлы cookie. Также имеются переключатели строгости, позволяющие немного ужесточить довольно свободные правила протокола Netscape (ценой блокировки некоторых безобидных файлов cookie).359360Предоставляются чёрный и белый списки доменов (оба отключены по умолчанию). Только домены, не входящие в чёрный список и присутствующие в белом списке (если белый список активен), участвуют в установке и возврате файлов cookie. Используйте аргумент конструктора *blocked\_domains* и методы `blocked_domains()` и `set_blocked_domains()` (а также соответствующий аргумент и методы для *allowed\_domains*). Если задан белый список, его можно отключить, установив значение [`None`](https://python-all.ru/3.0/library/constants.html#None).361362Домены в списках блокировки или разрешения, которые не начинаются с точки, должны в точности совпадать с доменом 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 – нет.363364[`DefaultCookiePolicy`](https://python-all.ru/3.0/library/http.cookiejar.html#http.cookiejar.DefaultCookiePolicy) реализует следующие дополнительные методы:365366#### `[http.cookiejar.DefaultCookiePolicy.blocked_domains]DefaultCookiePolicy.blocked_domains()`367368Возвращает последовательность заблокированных доменов (в виде кортежа).369370#### `[http.cookiejar.DefaultCookiePolicy.set_blocked_domains]DefaultCookiePolicy.set_blocked_domains(blocked_domains)`371372Устанавливает последовательность заблокированных доменов.373374#### `[http.cookiejar.DefaultCookiePolicy.is_blocked]DefaultCookiePolicy.is_blocked(domain)`375376Возвращает, находится ли377378*domain*379380в чёрном списке для установки или получения куки.381382#### `[http.cookiejar.DefaultCookiePolicy.allowed_domains]DefaultCookiePolicy.allowed_domains()`383384Возвращает385386[`None`](https://python-all.ru/3.0/library/constants.html#None)387388или последовательность разрешённых доменов (в виде кортежа).389390#### `[http.cookiejar.DefaultCookiePolicy.set_allowed_domains]DefaultCookiePolicy.set_allowed_domains(allowed_domains)`391392Устанавливает последовательность разрешённых доменов или393394[`None`](https://python-all.ru/3.0/library/constants.html#None)395396.397398#### `[http.cookiejar.DefaultCookiePolicy.is_not_allowed]DefaultCookiePolicy.is_not_allowed(domain)`399400Возвращает, не находится ли401402*domain*403404в белом списке для установки или получения куки.405406[`DefaultCookiePolicy`](https://python-all.ru/3.0/library/http.cookiejar.html#http.cookiejar.DefaultCookiePolicy) экземпляры имеют следующие атрибуты, которые все инициализируются из одноимённых аргументов конструктора и которым можно присваивать значения.407408#### `[http.cookiejar.DefaultCookiePolicy.rfc2109_as_netscape]DefaultCookiePolicy.rfc2109_as_netscape`409410Если true, запрашивает, чтобы экземпляр411412[`CookieJar`](https://python-all.ru/3.0/library/http.cookiejar.html#http.cookiejar.CookieJar)413414понижал версию файлов cookie RFC 2109 (т.е. файлы cookie, полученные в заголовке415416*Set-Cookie*417418с атрибутом версии cookie-attribute, равным 1) до файлов cookie Netscape, устанавливая атрибут версии экземпляра419420[`Cookie`](https://python-all.ru/3.0/library/http.cookiejar.html#http.cookiejar.Cookie)421422в 0. Значение по умолчанию –423424[`None`](https://python-all.ru/3.0/library/constants.html#None)425426, в этом случае файлы cookie RFC 2109 понижаются тогда и только тогда, когда обработка RFC 2965 отключена. Поэтому по умолчанию файлы cookie RFC 2109 понижаются.427428Общие переключатели строгости:429430#### `[http.cookiejar.DefaultCookiePolicy.strict_domain]DefaultCookiePolicy.strict_domain`431432Не разрешает сайтам устанавливать двухкомпонентные домены с национальными доменами верхнего уровня, такими как433434`.co.uk`435436,437438`.gov.uk`439440,441442`.co.nz`443444и т.д. Это далеко от совершенства и не гарантирует работы!445446Переключатели строгости протокола RFC 2965:447448#### `[http.cookiejar.DefaultCookiePolicy.strict_rfc2965_unverifiable]DefaultCookiePolicy.strict_rfc2965_unverifiable`449450Следовать правилам RFC 2965 для непроверяемых транзакций (обычно непроверяемая транзакция возникает в результате перенаправления или запроса изображения, размещённого на другом сайте). Если это False, куки451452*никогда*453454не блокируются на основе проверяемости.455456Переключатели строгости протокола Netscape:457458#### `[http.cookiejar.DefaultCookiePolicy.strict_ns_unverifiable]DefaultCookiePolicy.strict_ns_unverifiable`459460Применять правила RFC 2965 для непроверяемых транзакций также к куки Netscape.461462#### `[http.cookiejar.DefaultCookiePolicy.strict_ns_domain]DefaultCookiePolicy.strict_ns_domain`463464Флаги, указывающие, насколько строгими должны быть правила сопоставления доменов для cookies Netscape. Допустимые значения приведены ниже.465466#### `[http.cookiejar.DefaultCookiePolicy.strict_ns_set_initial_dollar]DefaultCookiePolicy.strict_ns_set_initial_dollar`467468Игнорирует cookies в заголовках Set-Cookie, имена которых начинаются с469470`'$'`471472.473474#### `[http.cookiejar.DefaultCookiePolicy.strict_ns_set_path]DefaultCookiePolicy.strict_ns_set_path`475476Не разрешать установку куки, путь которых не соответствует URI запроса.477478`strict_ns_domain` – это набор флагов. Его значение формируется путём логического ИЛИ (например, `DomainStrictNoDots|DomainStrictNonDomain` означает, что установлены оба флага).479480#### `[http.cookiejar.DefaultCookiePolicy.DomainStrictNoDots]DefaultCookiePolicy.DomainStrictNoDots`481482При установке файлов cookie «префикс хоста» не должен содержать точку (например,483484`www.foo.bar.com`485486не может установить файл cookie для487488`.bar.com`489490, потому что491492`www.foo`493494содержит точку).495496#### `[http.cookiejar.DefaultCookiePolicy.DomainStrictNonDomain]DefaultCookiePolicy.DomainStrictNonDomain`497498Файлы cookie, которые не указали явно атрибут499500`domain`501502cookie-attribute, могут быть возвращены только домену, равному домену, установившему cookie (например,503504`spam.example.com`505506не будут возвращены файлы cookie от507508`example.com`509510, у которых не было511512`domain`513514cookie-attribute).515516#### `[http.cookiejar.DefaultCookiePolicy.DomainRFC2965Match]DefaultCookiePolicy.DomainRFC2965Match`517518При установке куки требовать полного соответствия домена по RFC 2965.519520Следующие атрибуты предоставлены для удобства и представляют собой наиболее полезные комбинации указанных выше флагов:521522#### `[http.cookiejar.DefaultCookiePolicy.DomainLiberal]DefaultCookiePolicy.DomainLiberal`523524Эквивалентно 0 (то есть все указанные выше флаги строгости домена Netscape отключены).525526#### `[http.cookiejar.DefaultCookiePolicy.DomainStrict]DefaultCookiePolicy.DomainStrict`527528Эквивалентно529530`DomainStrictNoDots|DomainStrictNonDomain`531532.533534## Объекты Cookie535536[`Cookie`](https://python-all.ru/3.0/library/http.cookiejar.html#http.cookiejar.Cookie) имеют атрибуты Python, примерно соответствующие стандартным атрибутам cookie, определённым в различных стандартах cookie. Соответствие не является взаимно однозначным, так как есть сложные правила присвоения значений по умолчанию, потому что `max-age` и `expires` содержат эквивалентную информацию, и потому что RFC 2109 cookie могут быть «понижены» с помощью `http.cookiejar` с версии 1 до версии 0 (Netscape) cookie.537538Присваивание значения этим атрибутам не должно требоваться, за исключением редких случаев в методе [`CookiePolicy`](https://python-all.ru/3.0/library/http.cookiejar.html#http.cookiejar.CookiePolicy). Класс не обеспечивает внутреннюю согласованность, поэтому следует понимать, что делаешь, если это делать.539540#### `[http.cookiejar.Cookie.version]Cookie.version`541542Целое число или543544[`None`](https://python-all.ru/3.0/library/constants.html#None)545546. У Netscape-куки значение547548[`version`](https://python-all.ru/3.0/library/http.cookiejar.html#http.cookiejar.Cookie.version)549550равно 0. У куки RFC 2965 и RFC 2109 значение атрибута551552`version`553554равно 1. Однако обратите внимание, что555556`http.cookiejar`557558может «понизить» RFC 2109 куки до Netscape-куки, и в этом случае559560[`version`](https://python-all.ru/3.0/library/http.cookiejar.html#http.cookiejar.Cookie.version)561562будет равно 0.563564#### `[http.cookiejar.Cookie.name]Cookie.name`565566Имя cookie (строка).567568#### `[http.cookiejar.Cookie.value]Cookie.value`569570Значение cookie (строка) или571572[`None`](https://python-all.ru/3.0/library/constants.html#None)573574.575576#### `[http.cookiejar.Cookie.port]Cookie.port`577578Строка, представляющая порт или набор портов (например, ‘80’ или ‘80,8080’), или579580[`None`](https://python-all.ru/3.0/library/constants.html#None)581582.583584#### `[http.cookiejar.Cookie.path]Cookie.path`585586Путь к cookie (строка, например587588`'/acme/rocket_launchers'`589590).591592#### `[http.cookiejar.Cookie.secure]Cookie.secure`593594True, если cookie должен возвращаться только через защищённое соединение.595596#### `[http.cookiejar.Cookie.expires]Cookie.expires`597598Целое число – дата истечения в секундах от начала эпохи, или599600[`None`](https://python-all.ru/3.0/library/constants.html#None)601602. См. также метод603604[`is_expired()`](https://python-all.ru/3.0/library/http.cookiejar.html#http.cookiejar.Cookie.is_expired)605606.607608#### `[http.cookiejar.Cookie.discard]Cookie.discard`609610True, если это сессионный cookie.611612#### `[http.cookiejar.Cookie.comment]Cookie.comment`613614Строковый комментарий от сервера, поясняющий назначение этого cookie, или615616[`None`](https://python-all.ru/3.0/library/constants.html#None)617618.619620#### `[http.cookiejar.Cookie.comment_url]Cookie.comment_url`621622URL, указывающий на комментарий от сервера с пояснением назначения этого cookie, или623624[`None`](https://python-all.ru/3.0/library/constants.html#None)625626.627628#### `[http.cookiejar.Cookie.rfc2109]Cookie.rfc2109`629630True, если эта куки была получена как RFC 2109 куки (т.е. куки пришла в заголовке631632*Set-Cookie*633634, и значение атрибута Version в этом заголовке было равно 1). Этот атрибут предоставлен, потому что635636`http.cookiejar`637638может «понизить» RFC 2109 куки до Netscape-куки, и в этом случае639640[`version`](https://python-all.ru/3.0/library/http.cookiejar.html#http.cookiejar.Cookie.version)641642будет равно 0.643644#### `[http.cookiejar.Cookie.port_specified]Cookie.port_specified`645646True, если порт или набор портов был явно указан сервером (в647648*Set-Cookie*649650/651652*Set-Cookie2*653654заголовке).655656#### `[http.cookiejar.Cookie.domain_specified]Cookie.domain_specified`657658True, если домен был явно указан сервером.659660#### `[http.cookiejar.Cookie.domain_initial_dot]Cookie.domain_initial_dot`661662True, если домен, явно указанный сервером, начинался с точки (663664`'.'`665666).667668Cookie могут иметь дополнительные нестандартные атрибуты cookie. Доступ к ним можно получить с помощью следующих методов:669670#### `[http.cookiejar.Cookie.has_nonstandard_attr]Cookie.has_nonstandard_attr(name)`671672Возвращает true, если cookie имеет атрибут с указанным именем.673674#### `[http.cookiejar.Cookie.get_nonstandard_attr]Cookie.get_nonstandard_attr(name, default=None)`675676Если cookie имеет указанный атрибут cookie, возвращает его значение. В противном случае возвращает677678*default*679680.681682#### `[http.cookiejar.Cookie.set_nonstandard_attr]Cookie.set_nonstandard_attr(name, value)`683684Устанавливает значение указанного атрибута cookie.685686Класс [`Cookie`](https://python-all.ru/3.0/library/http.cookiejar.html#http.cookiejar.Cookie) также определяет следующий метод:687688#### `[http.cookiejar.Cookie.is_expired]Cookie.is_expired([now=None])`689690True, если прошло время, когда сервер запросил истечение cookie. Если691692*now*693694задан (в секундах от начала эпохи), возвращает, истёк ли cookie на указанный момент.695696## Примеры697698Первый пример показывает наиболее частое использование `http.cookiejar`:699700```python701import http.cookiejar, urllib.request702cj = http.cookiejar.CookieJar()703opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj))704r = opener.open("http://example.com/")705```706707Этот пример иллюстрирует, как открыть URL с использованием ваших куки Netscape, Mozilla или Lynx (предполагается соглашение Unix/Netscape о местоположении файла куки):708709```python710import os, http.cookiejar, urllib.request711cj = http.cookiejar.MozillaCookieJar()712cj.load(os.path.join(os.environ["HOME"], ".netscape/cookies.txt"))713opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj))714r = opener.open("http://example.com/")715```716717Следующий пример иллюстрирует использование [`DefaultCookiePolicy`](https://python-all.ru/3.0/library/http.cookiejar.html#http.cookiejar.DefaultCookiePolicy). Включите cookies по RFC 2965, ужесточите правила для доменов при установке и возврате cookies Netscape, а также заблокируйте возможность установки или возврата cookies для некоторых доменов:718719```python720import urllib.request721from http.cookiejar import CookieJar, DefaultCookiePolicy722policy = DefaultCookiePolicy(723 rfc2965=True, strict_ns_domain=Policy.DomainStrict,724 blocked_domains=["ads.net", ".ads.net"])725cj = CookieJar(policy)726opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj))727r = opener.open("http://example.com/")728```729