http.cookiejar.md
1> **Источник:** https://python-all.ru/3.4/library/http.cookiejar.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 21.24. [`http.cookiejar`](https://python-all.ru/3.4/library/http.cookiejar.html#module-http.cookiejar) – Обработка cookie для HTTP-клиентов89**Исходный код:** [Lib/http/cookiejar.py](https://python-all.ru/src/3.4/Lib/http/cookiejar.py)1011---1213The [`http.cookiejar`](https://python-all.ru/3.4/library/http.cookiejar.html#module-http.cookiejar) module defines classes for automatic handling of HTTP cookies. It is useful for accessing web sites that require small pieces of data – *cookies* – to be set on the client machine by an HTTP response from a web server, and then returned to the server in later HTTP requests.1415Поддерживаются как обычный протокол Netscape cookie, так и протокол, определённый в [**RFC 2965**](https://python-all.ru/3.4/library/http.cookiejar.html). Обработка RFC 2965 по умолчанию отключена. [**RFC 2109**](https://python-all.ru/3.4/library/http.cookiejar.html) cookie разбираются как Netscape cookie и впоследствии обрабатываются либо как Netscape, либо как RFC 2965 cookie в зависимости от действующей «политики». Обратите внимание, что подавляющее большинство cookie в интернете – это Netscape cookie. [`http.cookiejar`](https://python-all.ru/3.4/library/http.cookiejar.html#module-http.cookiejar) пытается следовать фактическому протоколу Netscape cookie (который существенно отличается от изложенного в оригинальной спецификации Netscape), включая учёт атрибутов cookie `max-age` и `port`, введённых в RFC 2965.1617> **Примечание**18>19> Различные именованные параметры, встречающиеся в заголовках *Set-Cookie* и *Set-Cookie2* (например, `domain` и `expires`), обычно называют *атрибутами*. Чтобы отличать их от атрибутов Python, в документации этого модуля используется термин *cookie-attribute*.2021Модуль определяет следующее исключение:2223#### `exception http.cookiejar.LoadError`2425Instances of [`FileCookieJar`](https://python-all.ru/3.4/library/http.cookiejar.html#http.cookiejar.FileCookieJar) raise this exception on failure to load cookies from a file. [`LoadError`](https://python-all.ru/3.4/library/http.cookiejar.html#http.cookiejar.LoadError) is a subclass of [`OSError`](https://python-all.ru/3.4/library/exceptions.html#OSError).2627Изменено в версии 3.3: LoadError стал подклассом [`OSError`](https://python-all.ru/3.4/library/exceptions.html#OSError) вместо [`IOError`](https://python-all.ru/3.4/library/exceptions.html#IOError).2829Предоставляются следующие классы:3031#### `class http.cookiejar.CookieJar(policy=None)`3233*policy* – это объект, реализующий интерфейс [`CookiePolicy`](https://python-all.ru/3.4/library/http.cookiejar.html#http.cookiejar.CookiePolicy).3435The [`CookieJar`](https://python-all.ru/3.4/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.4/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.3637#### `class http.cookiejar.FileCookieJar(filename, delayload=None, policy=None)`3839*policy* – это объект, реализующий интерфейс [`CookiePolicy`](https://python-all.ru/3.4/library/http.cookiejar.html#http.cookiejar.CookiePolicy). Остальные аргументы описаны в документации соответствующих атрибутов.4041A [`CookieJar`](https://python-all.ru/3.4/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.4/library/http.cookiejar.html#http.cookiejar.FileCookieJar.load) or [`revert()`](https://python-all.ru/3.4/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.4/library/http.cookiejar.html#file-cookie-jar-classes).4243#### `class http.cookiejar.CookiePolicy`4445Этот класс отвечает за принятие решения о том, следует ли принять каждый куки от сервера / вернуть его серверу.4647#### `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)`4849Аргументы конструктора следует передавать только в виде именованных аргументов. *blocked\_domains* – это последовательность доменных имён, с которых мы никогда не принимаем куки и на которые не отправляем куки. *allowed\_domains*, если не равно [`None`](https://python-all.ru/3.4/library/constants.html#None), – это последовательность доменов, для которых мы принимаем и отправляем куки. Что касается всех остальных аргументов, см. документацию объектов [`CookiePolicy`](https://python-all.ru/3.4/library/http.cookiejar.html#http.cookiejar.CookiePolicy) и [`DefaultCookiePolicy`](https://python-all.ru/3.4/library/http.cookiejar.html#http.cookiejar.DefaultCookiePolicy).5051[`DefaultCookiePolicy`](https://python-all.ru/3.4/library/http.cookiejar.html#http.cookiejar.DefaultCookiePolicy) реализует стандартные правила приёма/отклонения для Netscape и RFC 2965 cookie. По умолчанию cookie RFC 2109 (т.е. cookie, полученные в заголовке *Set-Cookie* с атрибутом cookie version, равным 1) обрабатываются по правилам RFC 2965. Однако если обработка RFC 2965 отключена или [`rfc2109_as_netscape`](https://python-all.ru/3.4/library/http.cookiejar.html#http.cookiejar.DefaultCookiePolicy.rfc2109_as_netscape) равно `True`, cookie RFC 2109 «понижаются» экземпляром [`CookieJar`](https://python-all.ru/3.4/library/http.cookiejar.html#http.cookiejar.CookieJar) до Netscape cookie путём установки атрибута `version` экземпляра [`Cookie`](https://python-all.ru/3.4/library/http.cookiejar.html#http.cookiejar.Cookie) в 0. [`DefaultCookiePolicy`](https://python-all.ru/3.4/library/http.cookiejar.html#http.cookiejar.DefaultCookiePolicy) также предоставляет некоторые параметры для более точной настройки политики.5253#### `class http.cookiejar.Cookie`5455Этот класс представляет cookie Netscape, RFC 2109 и RFC 2965. Не предполагается, что пользователи [`http.cookiejar`](https://python-all.ru/3.4/library/http.cookiejar.html#module-http.cookiejar) будут создавать собственные экземпляры [`Cookie`](https://python-all.ru/3.4/library/http.cookiejar.html#http.cookiejar.Cookie). Вместо этого, если необходимо, следует вызвать `make_cookies()` на экземпляре [`CookieJar`](https://python-all.ru/3.4/library/http.cookiejar.html#http.cookiejar.CookieJar).5657> **См. также**58>59> **Модуль [`urllib.request`](https://python-all.ru/3.4/library/urllib.request.html#module-urllib.request)**60>61> Открытие URL с автоматической обработкой куки.62>63> **Модуль [`http.cookies`](https://python-all.ru/3.4/library/http.cookies.html#module-http.cookies)**64>65> Классы HTTP cookie, в основном полезные для серверного кода. Модули66>67> [`http.cookiejar`](https://python-all.ru/3.4/library/http.cookiejar.html#module-http.cookiejar)68>69> и70>71> [`http.cookies`](https://python-all.ru/3.4/library/http.cookies.html#module-http.cookies)72>73> не зависят друг от друга.74>75> **[http://curl.haxx.se/rfc/cookie\_spec.html](https://python-all.ru/3.4/library/http.cookiejar.html)**76>77> Спецификация оригинального протокола Netscape cookie. Хотя это всё ещё доминирующий протокол, «протокол Netscape cookie», реализуемый всеми основными браузерами (а также78>79> [`http.cookiejar`](https://python-all.ru/3.4/library/http.cookiejar.html#module-http.cookiejar)80>81> ), лишь отдалённо напоминает тот, что описан в82>83> `cookie_spec.html`84>85> .86>87> **[**RFC 2109**](https://python-all.ru/3.4/library/http.cookiejar.html) – Механизм управления состоянием HTTP**88>89> Заменено RFC 2965. Использует90>91> *Set-Cookie*92>93> с version=1.94>95> **[**RFC 2965**](https://python-all.ru/3.4/library/http.cookiejar.html) – Механизм управления состоянием HTTP**96>97> Протокол Netscape с исправленными ошибками. Использует98>99> *Set-Cookie2*100>101> вместо102>103> *Set-Cookie*104>105> . Широко не используется.106>107> **[http://kristol.org/cookie/errata.html](https://python-all.ru/3.4/library/http.cookiejar.html)**108>109> Незавершённые исправления к RFC 2965.110>111> [**RFC 2964**](https://python-all.ru/3.4/library/http.cookiejar.html) – Использование управления состоянием HTTP112113## 21.24.1. Объекты CookieJar и FileCookieJar114115Объекты [`CookieJar`](https://python-all.ru/3.4/library/http.cookiejar.html#http.cookiejar.CookieJar) поддерживают протокол [*итератора*](https://python-all.ru/3.4/glossary.html#term-iterator) для перебора содержащихся в них объектов [`Cookie`](https://python-all.ru/3.4/library/http.cookiejar.html#http.cookiejar.Cookie).116117[`CookieJar`](https://python-all.ru/3.4/library/http.cookiejar.html#http.cookiejar.CookieJar) имеет следующие методы:118119#### `CookieJar.add_cookie_header(request)`120121Добавляет правильный заголовок *Cookie* к *запросу*.122123Если политика позволяет (т.е. атрибуты `rfc2965` и `hide_cookie2` экземпляра [`CookieJar`](https://python-all.ru/3.4/library/http.cookiejar.html#http.cookiejar.CookieJar) [`CookiePolicy`](https://python-all.ru/3.4/library/http.cookiejar.html#http.cookiejar.CookiePolicy) равны true и false соответственно), заголовок *Cookie2* также добавляется, когда это уместно.124125Объект *request* (обычно экземпляр `urllib.request..Request`) должен поддерживать методы `get_full_url()`, `get_host()`, `get_type()`, `unverifiable()`, `has_header()`, `get_header()`, `header_items()`, `add_unredirected_header()` и атрибут `origin_req_host`, как описано в [`urllib.request`](https://python-all.ru/3.4/library/urllib.request.html#module-urllib.request).126127Изменено в версии 3.3: Объекту *request* требуется атрибут `origin_req_host`. Зависимость от устаревшего метода `get_origin_req_host()` удалена.128129#### `CookieJar.extract_cookies(response, request)`130131Извлекает cookies из HTTP *response* и сохраняет их в [`CookieJar`](https://python-all.ru/3.4/library/http.cookiejar.html#http.cookiejar.CookieJar), если это разрешено политикой.132133[`CookieJar`](https://python-all.ru/3.4/library/http.cookiejar.html#http.cookiejar.CookieJar) будет искать допустимые заголовки *Set-Cookie* и *Set-Cookie2* в аргументе *response*, и сохранять cookies соответствующим образом (при условии одобрения методом [`CookiePolicy.set_ok()`](https://python-all.ru/3.4/library/http.cookiejar.html#http.cookiejar.CookiePolicy.set_ok)).134135Объект *response* (обычно результат вызова [`urllib.request.urlopen()`](https://python-all.ru/3.4/library/urllib.request.html#urllib.request.urlopen) или аналогичного) должен поддерживать метод `info()`, который возвращает экземпляр [`email.message.Message`](https://python-all.ru/3.4/library/email.message.html#email.message.Message).136137Объект *request* (обычно экземпляр [`urllib.request.Request`](https://python-all.ru/3.4/library/urllib.request.html#urllib.request.Request)) должен поддерживать методы `get_full_url()`, `get_host()`, `unverifiable()` и атрибут `origin_req_host`, как описано в [`urllib.request`](https://python-all.ru/3.4/library/urllib.request.html#module-urllib.request). Запрос используется для установки значений по умолчанию для атрибутов cookie, а также для проверки, разрешена ли установка cookie.138139Изменено в версии 3.3: Объекту *request* требуется атрибут `origin_req_host`. Зависимость от устаревшего метода `get_origin_req_host()` удалена.140141#### `CookieJar.set_policy(policy)`142143Устанавливает экземпляр [`CookiePolicy`](https://python-all.ru/3.4/library/http.cookiejar.html#http.cookiejar.CookiePolicy), который будет использоваться.144145#### `CookieJar.make_cookies(response, request)`146147Возвращает последовательность объектов [`Cookie`](https://python-all.ru/3.4/library/http.cookiejar.html#http.cookiejar.Cookie), извлечённых из объекта *response*.148149См. документацию [`extract_cookies()`](https://python-all.ru/3.4/library/http.cookiejar.html#http.cookiejar.CookieJar.extract_cookies) для получения интерфейсов, требуемых от аргументов *response* и *request*.150151#### `CookieJar.set_cookie_if_ok(cookie, request)`152153Устанавливает [`Cookie`](https://python-all.ru/3.4/library/http.cookiejar.html#http.cookiejar.Cookie), если политика разрешает это сделать.154155#### `CookieJar.set_cookie(cookie)`156157Устанавливает [`Cookie`](https://python-all.ru/3.4/library/http.cookiejar.html#http.cookiejar.Cookie), не проверяя по политике, следует ли его устанавливать.158159#### `CookieJar.clear([domain[, path[, name]]])`160161Очищает некоторые куки.162163Если вызван без аргументов, очищает все cookie. Если передан один аргумент, удаляются только cookie, принадлежащие этому *домену*. Если передано два аргумента, удаляются cookie, принадлежащие указанному *домену* и URL-*пути*. Если передано три аргумента, то удаляется cookie с указанными *доменом*, *путём* и *именем*.164165Возбуждает [`KeyError`](https://python-all.ru/3.4/library/exceptions.html#KeyError), если нет соответствующего cookie.166167#### `CookieJar.clear_session_cookies()`168169Удалить все сессионные куки.170171Отбрасывает все содержащиеся cookies, у которых атрибут `discard` имеет значение true (обычно потому, что у них не было атрибутов `max-age` или `expires`, либо был явный атрибут `discard`). Для интерактивных браузеров конец сессии обычно соответствует закрытию окна браузера.172173Обратите внимание, что метод `save()` в любом случае не сохраняет сессионные cookies, если только явно не указано иное путём передачи аргумента *ignore\_discard* со значением true.174175[`FileCookieJar`](https://python-all.ru/3.4/library/http.cookiejar.html#http.cookiejar.FileCookieJar) реализует следующие дополнительные методы:176177#### `FileCookieJar.save(filename=None, ignore_discard=False, ignore_expires=False)`178179Сохраняет куки в файл.180181Этот базовый класс возбуждает [`NotImplementedError`](https://python-all.ru/3.4/library/exceptions.html#NotImplementedError). Подклассы могут оставить этот метод нереализованным.182183*filename* – это имя файла, в который сохраняются cookies. Если *filename* не указан, используется `self.filename` (по умолчанию – значение, переданное конструктору, если оно было); если `self.filename` равно [`None`](https://python-all.ru/3.4/library/constants.html#None), возбуждается [`ValueError`](https://python-all.ru/3.4/library/exceptions.html#ValueError).184185*ignore\_discard*: сохранять даже те куки, которые помечены к удалению. *ignore\_expires*: сохранять даже куки с истекшим сроком действия.186187Файл перезаписывается, если он уже существует, тем самым удаляя все cookies, которые он содержит. Сохранённые cookies можно восстановить позже с помощью методов [`load()`](https://python-all.ru/3.4/library/http.cookiejar.html#http.cookiejar.FileCookieJar.load) или [`revert()`](https://python-all.ru/3.4/library/http.cookiejar.html#http.cookiejar.FileCookieJar.revert).188189#### `FileCookieJar.load(filename=None, ignore_discard=False, ignore_expires=False)`190191Загружает куки из файла.192193Старые куки сохраняются, если они не перезаписываются вновь загруженными.194195Аргументы такие же, как для [`save()`](https://python-all.ru/3.4/library/http.cookiejar.html#http.cookiejar.FileCookieJar.save).196197Указанный файл должен быть в формате, понятном классу, иначе будет возбуждено [`LoadError`](https://python-all.ru/3.4/library/http.cookiejar.html#http.cookiejar.LoadError). Кроме того, может быть возбуждено [`OSError`](https://python-all.ru/3.4/library/exceptions.html#OSError), например, если файл не существует.198199Изменено в версии 3.3: Раньше возбуждалось [`IOError`](https://python-all.ru/3.4/library/exceptions.html#IOError), теперь это псевдоним [`OSError`](https://python-all.ru/3.4/library/exceptions.html#OSError).200201#### `FileCookieJar.revert(filename=None, ignore_discard=False, ignore_expires=False)`202203Очищает все куки и перезагружает куки из сохраненного файла.204205[`revert()`](https://python-all.ru/3.4/library/http.cookiejar.html#http.cookiejar.FileCookieJar.revert) может возбуждать те же исключения, что и [`load()`](https://python-all.ru/3.4/library/http.cookiejar.html#http.cookiejar.FileCookieJar.load). В случае ошибки состояние объекта не изменится.206207Экземпляры [`FileCookieJar`](https://python-all.ru/3.4/library/http.cookiejar.html#http.cookiejar.FileCookieJar) имеют следующие открытые атрибуты:208209#### `FileCookieJar.filename`210211Имя файла по умолчанию, в котором хранятся куки. Этому атрибуту можно присваивать значение.212213#### `FileCookieJar.delayload`214215Если True, загружает файлы cookie с диска лениво. Этому атрибуту не следует присваивать значение. Это лишь подсказка, поскольку влияет только на производительность, а не на поведение (если только файлы cookie на диске не меняются). Объект [`CookieJar`](https://python-all.ru/3.4/library/http.cookiejar.html#http.cookiejar.CookieJar) может игнорировать его. Ни один из классов [`FileCookieJar`](https://python-all.ru/3.4/library/http.cookiejar.html#http.cookiejar.FileCookieJar), включённых в стандартную библиотеку, не загружает файлы cookie лениво.216217## 21.24.2. Подклассы FileCookieJar и взаимодействие с веб-браузерами218219Для чтения и записи предоставляются следующие подклассы [`CookieJar`](https://python-all.ru/3.4/library/http.cookiejar.html#http.cookiejar.CookieJar).220221#### `class http.cookiejar.MozillaCookieJar(filename, delayload=None, policy=None)`222223[`FileCookieJar`](https://python-all.ru/3.4/library/http.cookiejar.html#http.cookiejar.FileCookieJar), который может загружать и сохранять файлы cookie на диск в формате `cookies.txt` браузера Mozilla (этот формат также используется браузерами Lynx и Netscape).224225> **Примечание**226>227> Это теряет информацию о файлах cookie по стандарту RFC 2965, а также о более новых или нестандартных атрибутах cookie, таких как `port`.228229> **Предупреждение**230>231> Сделайте резервную копию ваших куки перед сохранением, если у вас есть куки, потеря или повреждение которых будут нежелательны (есть некоторые тонкости, которые могут привести к небольшим изменениям в файле при полном цикле загрузки/сохранения).232233Также учтите, что куки, сохраненные во время работы Mozilla, будут перезаписаны Mozilla.234235#### `class http.cookiejar.LWPCookieJar(filename, delayload=None, policy=None)`236237[`FileCookieJar`](https://python-all.ru/3.4/library/http.cookiejar.html#http.cookiejar.FileCookieJar), который может загружать и сохранять файлы cookie на диск в формате, совместимом с форматом файла `Set-Cookie3` библиотеки libwww-perl. Это удобно, если требуется хранить файлы cookie в читаемом человеком файле.238239## 21.24.3. Объекты CookiePolicy240241Объекты, реализующие интерфейс [`CookiePolicy`](https://python-all.ru/3.4/library/http.cookiejar.html#http.cookiejar.CookiePolicy), имеют следующие методы:242243#### `CookiePolicy.set_ok(cookie, request)`244245Возвращает логическое значение, указывающее, следует ли принять куки от сервера.246247*cookie* – это экземпляр [`Cookie`](https://python-all.ru/3.4/library/http.cookiejar.html#http.cookiejar.Cookie). *request* – это объект, реализующий интерфейс, определённый в документации к [`CookieJar.extract_cookies()`](https://python-all.ru/3.4/library/http.cookiejar.html#http.cookiejar.CookieJar.extract_cookies).248249#### `CookiePolicy.return_ok(cookie, request)`250251Возвращает логическое значение, указывающее, следует ли вернуть куки серверу.252253*cookie* – это экземпляр [`Cookie`](https://python-all.ru/3.4/library/http.cookiejar.html#http.cookiejar.Cookie). *request* – это объект, реализующий интерфейс, определённый в документации к [`CookieJar.add_cookie_header()`](https://python-all.ru/3.4/library/http.cookiejar.html#http.cookiejar.CookieJar.add_cookie_header).254255#### `CookiePolicy.domain_return_ok(domain, request)`256257Возвращает false, если cookie не должны быть возвращены для данного домена cookie.258259Этот метод является оптимизацией. Он устраняет необходимость проверять каждый файл cookie для определённого домена (что может потребовать чтения многих файлов). Возврат true из [`domain_return_ok()`](https://python-all.ru/3.4/library/http.cookiejar.html#http.cookiejar.CookiePolicy.domain_return_ok) и [`path_return_ok()`](https://python-all.ru/3.4/library/http.cookiejar.html#http.cookiejar.CookiePolicy.path_return_ok) оставляет всю работу на [`return_ok()`](https://python-all.ru/3.4/library/http.cookiejar.html#http.cookiejar.CookiePolicy.return_ok).260261Если [`domain_return_ok()`](https://python-all.ru/3.4/library/http.cookiejar.html#http.cookiejar.CookiePolicy.domain_return_ok) возвращает true для домена cookie, то [`path_return_ok()`](https://python-all.ru/3.4/library/http.cookiejar.html#http.cookiejar.CookiePolicy.path_return_ok) вызывается для пути cookie. В противном случае [`path_return_ok()`](https://python-all.ru/3.4/library/http.cookiejar.html#http.cookiejar.CookiePolicy.path_return_ok) и [`return_ok()`](https://python-all.ru/3.4/library/http.cookiejar.html#http.cookiejar.CookiePolicy.return_ok) никогда не вызываются для этого домена cookie. Если [`path_return_ok()`](https://python-all.ru/3.4/library/http.cookiejar.html#http.cookiejar.CookiePolicy.path_return_ok) возвращает true, то [`return_ok()`](https://python-all.ru/3.4/library/http.cookiejar.html#http.cookiejar.CookiePolicy.return_ok) вызывается с самим объектом [`Cookie`](https://python-all.ru/3.4/library/http.cookiejar.html#http.cookiejar.Cookie) для полной проверки. В противном случае [`return_ok()`](https://python-all.ru/3.4/library/http.cookiejar.html#http.cookiejar.CookiePolicy.return_ok) никогда не вызывается для этого пути cookie.262263Обратите внимание, что [`domain_return_ok()`](https://python-all.ru/3.4/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.4/library/http.cookiejar.html#http.cookiejar.CookiePolicy.path_return_ok).264265Аргумент *request* описан в документации к [`return_ok()`](https://python-all.ru/3.4/library/http.cookiejar.html#http.cookiejar.CookiePolicy.return_ok).266267#### `CookiePolicy.path_return_ok(path, request)`268269Возвращает false, если cookie не должны быть возвращены для указанного пути cookie.270271См. документацию к [`domain_return_ok()`](https://python-all.ru/3.4/library/http.cookiejar.html#http.cookiejar.CookiePolicy.domain_return_ok).272273В дополнение к реализации вышеуказанных методов, реализации интерфейса [`CookiePolicy`](https://python-all.ru/3.4/library/http.cookiejar.html#http.cookiejar.CookiePolicy) также должны предоставлять следующие атрибуты, указывающие, какие протоколы следует использовать и как. Все эти атрибуты могут быть изменены (присвоены).274275#### `CookiePolicy.netscape`276277Реализация протокола Netscape.278279#### `CookiePolicy.rfc2965`280281Реализует протокол RFC 2965.282283#### `CookiePolicy.hide_cookie2`284285Не добавлять заголовок *Cookie2* к запросам (наличие этого заголовка указывает серверу на то, что мы понимаем куки RFC 2965).286287Самый удобный способ определить класс [`CookiePolicy`](https://python-all.ru/3.4/library/http.cookiejar.html#http.cookiejar.CookiePolicy) – создать подкласс [`DefaultCookiePolicy`](https://python-all.ru/3.4/library/http.cookiejar.html#http.cookiejar.DefaultCookiePolicy) и переопределить некоторые или все методы, описанные выше. Сам [`CookiePolicy`](https://python-all.ru/3.4/library/http.cookiejar.html#http.cookiejar.CookiePolicy) можно использовать как «нулевую политику», разрешающую устанавливать и получать любые файлы cookie (вряд ли это будет полезно).288289## 21.24.4. Объекты DefaultCookiePolicy290291Реализует стандартные правила принятия и возврата куки.292293Охватываются как куки RFC 2965, так и Netscape. Обработка RFC 2965 отключена по умолчанию.294295Самый простой способ создать свою политику – переопределить этот класс и вызывать его методы в ваших переопределённых реализациях перед добавлением собственных дополнительных проверок:296297```python298import http.cookiejar299class MyCookiePolicy(http.cookiejar.DefaultCookiePolicy):300 def set_ok(self, cookie, request):301 if not http.cookiejar.DefaultCookiePolicy.set_ok(self, cookie, request):302 return False303 if i_dont_want_to_store_this_cookie(cookie):304 return False305 return True306```307308В дополнение к функциям, необходимым для реализации интерфейса [`CookiePolicy`](https://python-all.ru/3.4/library/http.cookiejar.html#http.cookiejar.CookiePolicy), этот класс позволяет запрещать или разрешать доменам устанавливать и получать файлы cookie. Также имеются переключатели строгости, позволяющие немного ужесточить довольно свободные правила протокола Netscape (ценой блокировки некоторых безобидных файлов cookie).309310Предоставляются чёрный и белый списки доменов (оба отключены по умолчанию). Только домены, не входящие в чёрный список и присутствующие в белом списке (если белый список активен), участвуют в установке и возврате файлов cookie. Используйте аргумент конструктора *blocked\_domains* и методы `blocked_domains()` и `set_blocked_domains()` (а также соответствующий аргумент и методы для *allowed\_domains*). Если задан белый список, его можно отключить, установив значение [`None`](https://python-all.ru/3.4/library/constants.html#None).311312Домены в списках блокировки или разрешения, которые не начинаются с точки, должны в точности совпадать с доменом 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 – нет.313314[`DefaultCookiePolicy`](https://python-all.ru/3.4/library/http.cookiejar.html#http.cookiejar.DefaultCookiePolicy) реализует следующие дополнительные методы:315316#### `DefaultCookiePolicy.blocked_domains()`317318Возвращает последовательность заблокированных доменов (в виде кортежа).319320#### `DefaultCookiePolicy.set_blocked_domains(blocked_domains)`321322Устанавливает последовательность заблокированных доменов.323324#### `DefaultCookiePolicy.is_blocked(domain)`325326Возвращает, находится ли *domain* в чёрном списке для установки или получения куки.327328#### `DefaultCookiePolicy.allowed_domains()`329330Возвращает [`None`](https://python-all.ru/3.4/library/constants.html#None) или последовательность разрешённых доменов (в виде кортежа).331332#### `DefaultCookiePolicy.set_allowed_domains(allowed_domains)`333334Устанавливает последовательность разрешённых доменов или [`None`](https://python-all.ru/3.4/library/constants.html#None).335336#### `DefaultCookiePolicy.is_not_allowed(domain)`337338Возвращает, не находится ли *domain* в белом списке для установки или получения куки.339340[`DefaultCookiePolicy`](https://python-all.ru/3.4/library/http.cookiejar.html#http.cookiejar.DefaultCookiePolicy) экземпляры имеют следующие атрибуты, которые все инициализируются из одноимённых аргументов конструктора и которым можно присваивать значения.341342#### `DefaultCookiePolicy.rfc2109_as_netscape`343344Если true, запрашивает, чтобы экземпляр [`CookieJar`](https://python-all.ru/3.4/library/http.cookiejar.html#http.cookiejar.CookieJar) понижал версию файлов cookie RFC 2109 (т.е. файлы cookie, полученные в заголовке *Set-Cookie* с атрибутом версии cookie-attribute, равным 1) до файлов cookie Netscape, устанавливая атрибут версии экземпляра [`Cookie`](https://python-all.ru/3.4/library/http.cookiejar.html#http.cookiejar.Cookie) в 0. Значение по умолчанию – [`None`](https://python-all.ru/3.4/library/constants.html#None), в этом случае файлы cookie RFC 2109 понижаются тогда и только тогда, когда обработка RFC 2965 отключена. Поэтому по умолчанию файлы cookie RFC 2109 понижаются.345346Общие переключатели строгости:347348#### `DefaultCookiePolicy.strict_domain`349350Не разрешает сайтам устанавливать двухкомпонентные домены с национальными доменами верхнего уровня, такими как `.co.uk`, `.gov.uk`, `.co.nz` и т.д. Это далеко от совершенства и не гарантирует работы!351352Переключатели строгости протокола RFC 2965:353354#### `DefaultCookiePolicy.strict_rfc2965_unverifiable`355356Следовать правилам RFC 2965 для непроверяемых транзакций (обычно непроверяемая транзакция возникает в результате перенаправления или запроса изображения, размещённого на другом сайте). Если это False, куки *никогда* не блокируются на основе проверяемости.357358Переключатели строгости протокола Netscape:359360#### `DefaultCookiePolicy.strict_ns_unverifiable`361362Применять правила RFC 2965 для непроверяемых транзакций даже к куки Netscape.363364#### `DefaultCookiePolicy.strict_ns_domain`365366Флаги, указывающие, насколько строгими должны быть правила сопоставления доменов для cookies Netscape. Допустимые значения приведены ниже.367368#### `DefaultCookiePolicy.strict_ns_set_initial_dollar`369370Игнорирует cookies в заголовках Set-Cookie, имена которых начинаются с `'$'`.371372#### `DefaultCookiePolicy.strict_ns_set_path`373374Не разрешать установку куки, путь которых не соответствует URI запроса.375376`strict_ns_domain` – это набор флагов. Его значение формируется путём логического ИЛИ (например, `DomainStrictNoDots|DomainStrictNonDomain` означает, что установлены оба флага).377378#### `DefaultCookiePolicy.DomainStrictNoDots`379380При установке файлов cookie «префикс хоста» не должен содержать точку (например, `www.foo.bar.com` не может установить файл cookie для `.bar.com`, потому что `www.foo` содержит точку).381382#### `DefaultCookiePolicy.DomainStrictNonDomain`383384Файлы cookie, которые не указали явно атрибут `domain` cookie-attribute, могут быть возвращены только домену, равному домену, установившему cookie (например, `spam.example.com` не будут возвращены файлы cookie от `example.com`, у которых не было `domain` cookie-attribute).385386#### `DefaultCookiePolicy.DomainRFC2965Match`387388При установке куки требовать полного соответствия домена по RFC 2965.389390Следующие атрибуты предоставлены для удобства и представляют собой наиболее полезные комбинации указанных выше флагов:391392#### `DefaultCookiePolicy.DomainLiberal`393394Эквивалентно 0 (то есть все указанные выше флаги строгости домена Netscape отключены).395396#### `DefaultCookiePolicy.DomainStrict`397398Эквивалентно `DomainStrictNoDots|DomainStrictNonDomain`.399400## 21.24.5. Объекты Cookie401402Экземпляры [`Cookie`](https://python-all.ru/3.4/library/http.cookiejar.html#http.cookiejar.Cookie) имеют атрибуты Python, примерно соответствующие стандартным атрибутам cookie, указанным в различных стандартах cookie. Соответствие не является взаимно однозначным, поскольку существуют сложные правила назначения значений по умолчанию, потому что атрибуты cookie `max-age` и `expires` содержат эквивалентную информацию, и потому что файлы cookie RFC 2109 могут быть «понижены» с помощью [`http.cookiejar`](https://python-all.ru/3.4/library/http.cookiejar.html#module-http.cookiejar) с версии 1 до версии 0 (Netscape).403404Присваивание значения этим атрибутам не должно требоваться, за исключением редких случаев в методе [`CookiePolicy`](https://python-all.ru/3.4/library/http.cookiejar.html#http.cookiejar.CookiePolicy). Класс не обеспечивает внутреннюю согласованность, поэтому следует понимать, что делаешь, если это делать.405406#### `Cookie.version`407408Целое число или [`None`](https://python-all.ru/3.4/library/constants.html#None). Файлы cookie Netscape имеют [`version`](https://python-all.ru/3.4/library/http.cookiejar.html#http.cookiejar.Cookie.version) 0. RFC 2965 и RFC 2109 имеют атрибут `version` cookie, равный 1. Однако учтите, что [`http.cookiejar`](https://python-all.ru/3.4/library/http.cookiejar.html#module-http.cookiejar) может «понизить» файлы cookie RFC 2109 до файлов cookie Netscape, и в этом случае [`version`](https://python-all.ru/3.4/library/http.cookiejar.html#http.cookiejar.Cookie.version) равен 0.409410#### `Cookie.name`411412Имя cookie (строка).413414#### `Cookie.value`415416Значение cookie (строка) или [`None`](https://python-all.ru/3.4/library/constants.html#None).417418#### `Cookie.port`419420Строка, представляющая порт или набор портов (например, ‘80’ или ‘80,8080’), или [`None`](https://python-all.ru/3.4/library/constants.html#None).421422#### `Cookie.path`423424Путь к cookie (строка, например `'/acme/rocket_launchers'`).425426#### `Cookie.secure`427428`True`, если cookie должен возвращаться только через защищённое соединение.429430#### `Cookie.expires`431432Целое число – дата истечения в секундах от начала эпохи, или [`None`](https://python-all.ru/3.4/library/constants.html#None). См. также метод [`is_expired()`](https://python-all.ru/3.4/library/http.cookiejar.html#http.cookiejar.Cookie.is_expired).433434#### `Cookie.discard`435436`True`, если это сессионный cookie.437438#### `Cookie.comment`439440Строковый комментарий от сервера, поясняющий назначение этого cookie, или [`None`](https://python-all.ru/3.4/library/constants.html#None).441442#### `Cookie.comment_url`443444URL, указывающий на комментарий от сервера с пояснением назначения этого cookie, или [`None`](https://python-all.ru/3.4/library/constants.html#None).445446#### `Cookie.rfc2109`447448`True`, если этот cookie был получен как cookie по RFC 2109 (т.е. cookie поступил в заголовке *Set-Cookie*, и значение атрибута Version в этом заголовке было равно 1). Этот атрибут предусмотрен, потому что [`http.cookiejar`](https://python-all.ru/3.4/library/http.cookiejar.html#module-http.cookiejar) может «понижать» cookies RFC 2109 до cookies Netscape, и в этом случае [`version`](https://python-all.ru/3.4/library/http.cookiejar.html#http.cookiejar.Cookie.version) равен 0.449450#### `Cookie.port_specified`451452`True`, если порт или набор портов был явно указан сервером (в заголовке *Set-Cookie* / *Set-Cookie2*).453454#### `Cookie.domain_specified`455456`True`, если домен был явно указан сервером.457458#### `Cookie.domain_initial_dot`459460`True`, если домен, явно указанный сервером, начинался с точки (`'.'`).461462Cookie могут иметь дополнительные нестандартные атрибуты cookie. Доступ к ним можно получить с помощью следующих методов:463464#### `Cookie.has_nonstandard_attr(name)`465466Возвращает true, если cookie имеет атрибут с указанным именем.467468#### `Cookie.get_nonstandard_attr(name, default=None)`469470Если cookie имеет указанный атрибут cookie, возвращает его значение. В противном случае возвращает *default*.471472#### `Cookie.set_nonstandard_attr(name, value)`473474Устанавливает значение указанного атрибута cookie.475476Класс [`Cookie`](https://python-all.ru/3.4/library/http.cookiejar.html#http.cookiejar.Cookie) также определяет следующий метод:477478#### `Cookie.is_expired(now=None)`479480`True`, если срок действия cookie истёк (то есть время, указанное сервером как дата истечения, прошло). Если параметр *now* задан (в секундах от начала эпохи), возвращается, истёк ли cookie на указанный момент времени.481482## 21.24.6. Примеры483484Первый пример показывает наиболее распространённое использование [`http.cookiejar`](https://python-all.ru/3.4/library/http.cookiejar.html#module-http.cookiejar):485486```python487import http.cookiejar, urllib.request488cj = http.cookiejar.CookieJar()489opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj))490r = opener.open("http://example.com/")491```492493Этот пример иллюстрирует, как открыть URL с использованием ваших куки Netscape, Mozilla или Lynx (предполагается соглашение Unix/Netscape о местоположении файла куки):494495```python496import os, http.cookiejar, urllib.request497cj = http.cookiejar.MozillaCookieJar()498cj.load(os.path.join(os.path.expanduser("~"), ".netscape", "cookies.txt"))499opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj))500r = opener.open("http://example.com/")501```502503Следующий пример иллюстрирует использование [`DefaultCookiePolicy`](https://python-all.ru/3.4/library/http.cookiejar.html#http.cookiejar.DefaultCookiePolicy). Включите cookies по RFC 2965, ужесточите правила для доменов при установке и возврате cookies Netscape, а также заблокируйте возможность установки или возврата cookies для некоторых доменов:504505```python506import urllib.request507from http.cookiejar import CookieJar, DefaultCookiePolicy508policy = DefaultCookiePolicy(509 rfc2965=True, strict_ns_domain=Policy.DomainStrict,510 blocked_domains=["ads.net", ".ads.net"])511cj = CookieJar(policy)512opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj))513r = opener.open("http://example.com/")514```515