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

http.cookiejar.md

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

1> **Источник:** https://python-all.ru/3.15/library/http.cookiejar.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# `http.cookiejar` – Обработка cookie для HTTP-клиентов89**Исходный код:** [Lib/http/cookiejar.py](https://python-all.ru/src/3.15/Lib/http/cookiejar.py)1011---1213Модуль `http.cookiejar` определяет классы для автоматической обработки HTTP-куки. Он полезен для доступа к веб-сайтам, которые требуют, чтобы небольшие фрагменты данных – *куки* – устанавливались на клиентской машине HTTP-ответом веб-сервера, а затем возвращались серверу в последующих HTTP-запросах.1415Обрабатываются как обычный протокол Netscape cookie, так и протокол, определённый в [**RFC 2965**](https://python-all.ru/3.15/library/http.cookiejar.html). Обработка RFC 2965 по умолчанию выключена. [**RFC 2109**](https://python-all.ru/3.15/library/http.cookiejar.html) куки разбираются как Netscape-куки и впоследствии обрабатываются либо как Netscape, либо как RFC 2965 в зависимости от действующей «политики». Обратите внимание, что подавляющее большинство куки в интернете – это Netscape-куки. `http.cookiejar` пытается следовать де-факто протоколу Netscape cookie (который существенно отличается от изложенного в оригинальной спецификации Netscape), включая учёт атрибутов cookie `max-age` и `port`, введённых в RFC 2965.1617> **Примечание**18>19> Различные именованные параметры, встречающиеся в заголовках *Set-Cookie* и *Set-Cookie2* (например, `domain` и `expires`), по традиции называются *атрибутами*. Чтобы отличать их от атрибутов Python, в документации этого модуля используется термин *cookie-атрибут*.2021Модуль определяет следующее исключение:2223#### `exception http.cookiejar.LoadError`2425Экземпляры [`FileCookieJar`](https://python-all.ru/3.15/library/http.cookiejar.html#http.cookiejar.FileCookieJar) вызывают это исключение при неудачной загрузке куки из файла. `LoadError` является подклассом [`OSError`](https://python-all.ru/3.15/library/exceptions.html#OSError).2627Изменено в версии 3.3: `LoadError` раньше был подтипом [`IOError`](https://python-all.ru/3.15/library/exceptions.html#IOError), который теперь является псевдонимом [`OSError`](https://python-all.ru/3.15/library/exceptions.html#OSError).2829Предоставляются следующие классы:3031#### `class http.cookiejar.CookieJar(policy=None)`3233*policy* – это объект, реализующий интерфейс [`CookiePolicy`](https://python-all.ru/3.15/library/http.cookiejar.html#http.cookiejar.CookiePolicy).3435Класс `CookieJar` хранит HTTP-куки. Он извлекает куки из HTTP-запросов и возвращает их в HTTP-ответах. Экземпляры `CookieJar` автоматически удаляют устаревшие куки при необходимости. Подклассы также отвечают за сохранение и загрузку куки из файла или базы данных.3637#### `class http.cookiejar.FileCookieJar(filename=None, delayload=None, policy=None)`3839*policy* – это объект, реализующий интерфейс [`CookiePolicy`](https://python-all.ru/3.15/library/http.cookiejar.html#http.cookiejar.CookiePolicy). Остальные аргументы описаны в документации соответствующих атрибутов.4041[`CookieJar`](https://python-all.ru/3.15/library/http.cookiejar.html#http.cookiejar.CookieJar), который может загружать куки из файла на диске и, возможно, сохранять их туда. Куки **НЕ** загружаются из указанного файла до тех пор, пока не будет вызван метод [`load()`](https://python-all.ru/3.15/library/http.cookiejar.html#http.cookiejar.FileCookieJar.load) или [`revert()`](https://python-all.ru/3.15/library/http.cookiejar.html#http.cookiejar.FileCookieJar.revert). Подклассы этого класса описаны в разделе [Подклассы FileCookieJar и взаимодействие с веб-браузерами](https://python-all.ru/3.15/library/http.cookiejar.html#file-cookie-jar-classes).4243Не следует инициализировать напрямую – используйте вместо этого его подклассы, перечисленные ниже.4445Изменено в версии 3.8: Параметр filename поддерживает [объект, подобный пути](https://python-all.ru/3.15/glossary.html#term-path-like-object).4647#### `class http.cookiejar.CookiePolicy`4849Этот класс отвечает за принятие решения о том, следует ли принять каждый куки от сервера / вернуть его серверу.5051#### `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, secure_protocols=('https', 'wss'))`5253Аргументы конструктора должны передаваться только как именованные аргументы. *blocked\_domains* – это последовательность доменных имён, с которых мы никогда не принимаем куки и которым никогда не возвращаем куки. *allowed\_domains*, если не равно `None`, – это последовательность единственных доменов, для которых мы принимаем и возвращаем куки. *secure\_protocols* – это последовательность протоколов, для которых могут быть добавлены защищённые куки. По умолчанию *https* и *wss* (защищённый вебсокет) считаются защищёнными протоколами. Остальные аргументы описаны в документации объектов [`CookiePolicy`](https://python-all.ru/3.15/library/http.cookiejar.html#http.cookiejar.CookiePolicy) и `DefaultCookiePolicy`.5455`DefaultCookiePolicy` реализует стандартные правила приёма/отклонения для Netscape и [**RFC 2965**](https://python-all.ru/3.15/library/http.cookiejar.html) куки. По умолчанию куки [**RFC 2109**](https://python-all.ru/3.15/library/http.cookiejar.html) (то есть куки, полученные в заголовке *Set-Cookie* с атрибутом версии cookie, равным 1) обрабатываются по правилам RFC 2965. Однако если обработка RFC 2965 отключена или [`rfc2109_as_netscape`](https://python-all.ru/3.15/library/http.cookiejar.html#http.cookiejar.DefaultCookiePolicy.rfc2109_as_netscape) равно `True`, куки RFC 2109 «понижаются» экземпляром [`CookieJar`](https://python-all.ru/3.15/library/http.cookiejar.html#http.cookiejar.CookieJar) до Netscape-куки путём установки атрибута [`version`](https://python-all.ru/3.15/library/http.cookiejar.html#http.cookiejar.Cookie.version) экземпляра [`Cookie`](https://python-all.ru/3.15/library/http.cookiejar.html#http.cookiejar.Cookie) в 0. `DefaultCookiePolicy` также предоставляет некоторые параметры для тонкой настройки политики.5657#### `class http.cookiejar.Cookie`5859Этот класс представляет куки Netscape, [**RFC 2109**](https://python-all.ru/3.15/library/http.cookiejar.html) и [**RFC 2965**](https://python-all.ru/3.15/library/http.cookiejar.html). Не предполагается, что пользователи `http.cookiejar` будут создавать собственные экземпляры `Cookie`. Вместо этого при необходимости следует вызвать [`make_cookies()`](https://python-all.ru/3.15/library/http.cookiejar.html#http.cookiejar.CookieJar.make_cookies) на экземпляре [`CookieJar`](https://python-all.ru/3.15/library/http.cookiejar.html#http.cookiejar.CookieJar).6061> **См. также**62>63> **Модуль [`urllib.request`](https://python-all.ru/3.15/library/urllib.request.html#module-urllib.request)**64>65> Открытие URL с автоматической обработкой куки.66>67> **Модуль [`http.cookies`](https://python-all.ru/3.15/library/http.cookies.html#module-http.cookies)**68>69> Классы HTTP-куки, в основном полезные для серверного кода. Модули `http.cookiejar` и [`http.cookies`](https://python-all.ru/3.15/library/http.cookies.html#module-http.cookies) не зависят друг от друга.70>71> **[https://curl.se/rfc/cookie\_spec.html](https://python-all.ru/3.15/library/http.cookiejar.html)**72>73> Спецификация оригинального протокола Netscape cookie. Хотя это всё ещё доминирующий протокол, «протокол Netscape cookie», реализованный всеми основными браузерами (и `http.cookiejar`), лишь отдалённо напоминает тот, что описан в `cookie_spec.html`.74>75> **[**RFC 2109**](https://python-all.ru/3.15/library/http.cookiejar.html) – Механизм управления состоянием HTTP**76>77> Заменён [**RFC 2965**](https://python-all.ru/3.15/library/http.cookiejar.html). Использует *Set-Cookie* с version=1.78>79> **[**RFC 2965**](https://python-all.ru/3.15/library/http.cookiejar.html) – Механизм управления состоянием HTTP**80>81> Протокол Netscape с исправленными ошибками. Использует *Set-Cookie2* вместо *Set-Cookie*. Широко не используется.82>83> **[https://kristol.org/cookie/errata.html](https://python-all.ru/3.15/library/http.cookiejar.html)**84>85> Незавершённая errata к [**RFC 2965**](https://python-all.ru/3.15/library/http.cookiejar.html).86>87> [**RFC 2964**](https://python-all.ru/3.15/library/http.cookiejar.html) – Использование управления состоянием HTTP8889## Объекты CookieJar и FileCookieJar9091Объекты [`CookieJar`](https://python-all.ru/3.15/library/http.cookiejar.html#http.cookiejar.CookieJar) поддерживают протокол [итератора](https://python-all.ru/3.15/glossary.html#term-iterator) для итерации по содержащимся объектам [`Cookie`](https://python-all.ru/3.15/library/http.cookiejar.html#http.cookiejar.Cookie).9293[`CookieJar`](https://python-all.ru/3.15/library/http.cookiejar.html#http.cookiejar.CookieJar) имеет следующие методы:9495#### `CookieJar.add_cookie_header(request)`9697Добавляет правильный заголовок *Cookie* к *запросу*.9899Если политика разрешает (то есть атрибуты [`rfc2965`](https://python-all.ru/3.15/library/http.cookiejar.html#http.cookiejar.CookiePolicy.rfc2965) и [`hide_cookie2`](https://python-all.ru/3.15/library/http.cookiejar.html#http.cookiejar.CookiePolicy.hide_cookie2) экземпляра [`CookieJar`](https://python-all.ru/3.15/library/http.cookiejar.html#http.cookiejar.CookieJar) [`CookiePolicy`](https://python-all.ru/3.15/library/http.cookiejar.html#http.cookiejar.CookiePolicy) имеют значения true и false соответственно), заголовок *Cookie2* также добавляется, когда это уместно.100101Объект *запроса* (обычно экземпляр [`urllib.request.Request`](https://python-all.ru/3.15/library/urllib.request.html#urllib.request.Request)) должен поддерживать методы [`get_full_url()`](https://python-all.ru/3.15/library/urllib.request.html#urllib.request.Request.get_full_url), [`has_header()`](https://python-all.ru/3.15/library/urllib.request.html#urllib.request.Request.has_header), [`get_header()`](https://python-all.ru/3.15/library/urllib.request.html#urllib.request.Request.get_header), [`header_items()`](https://python-all.ru/3.15/library/urllib.request.html#urllib.request.Request.header_items), [`add_unredirected_header()`](https://python-all.ru/3.15/library/urllib.request.html#urllib.request.Request.add_unredirected_header) и атрибуты [`host`](https://python-all.ru/3.15/library/urllib.request.html#urllib.request.Request.host), [`type`](https://python-all.ru/3.15/library/urllib.request.html#urllib.request.Request.type), [`unverifiable`](https://python-all.ru/3.15/library/urllib.request.html#urllib.request.Request.unverifiable) и [`origin_req_host`](https://python-all.ru/3.15/library/urllib.request.html#urllib.request.Request.origin_req_host), как описано в [`urllib.request`](https://python-all.ru/3.15/library/urllib.request.html#module-urllib.request).102103Изменено в версии 3.3: объект *запроса* требует атрибут [`origin_req_host`](https://python-all.ru/3.15/library/urllib.request.html#urllib.request.Request.origin_req_host) . Зависимость от устаревшего метода `get_origin_req_host()` была удалена.104105#### `CookieJar.extract_cookies(response, request)`106107Извлекает куки из HTTP-*ответа* и сохраняет их в [`CookieJar`](https://python-all.ru/3.15/library/http.cookiejar.html#http.cookiejar.CookieJar), где это разрешено политикой.108109[`CookieJar`](https://python-all.ru/3.15/library/http.cookiejar.html#http.cookiejar.CookieJar) будет искать допустимые заголовки *Set-Cookie* и *Set-Cookie2* в аргументе *ответа*, и сохранять cookie соответствующим образом (с учётом одобрения метода [`CookiePolicy.set_ok()`](https://python-all.ru/3.15/library/http.cookiejar.html#http.cookiejar.CookiePolicy.set_ok)).110111Объект *ответа* (обычно результат вызова [`urllib.request.urlopen()`](https://python-all.ru/3.15/library/urllib.request.html#urllib.request.urlopen) или подобного) должен поддерживать метод [`info()`](https://python-all.ru/3.15/library/http.client.html#http.client.HTTPResponse.info), который возвращает экземпляр [`email.message.Message`](https://python-all.ru/3.15/library/email.compat32-message.html#email.message.Message).112113Объект *запроса* (обычно экземпляр [`urllib.request.Request`](https://python-all.ru/3.15/library/urllib.request.html#urllib.request.Request)) должен поддерживать метод [`get_full_url()`](https://python-all.ru/3.15/library/urllib.request.html#urllib.request.Request.get_full_url) и атрибуты [`host`](https://python-all.ru/3.15/library/urllib.request.html#urllib.request.Request.host), [`unverifiable`](https://python-all.ru/3.15/library/urllib.request.html#urllib.request.Request.unverifiable) и [`origin_req_host`](https://python-all.ru/3.15/library/urllib.request.html#urllib.request.Request.origin_req_host), как описано в [`urllib.request`](https://python-all.ru/3.15/library/urllib.request.html#module-urllib.request). Запрос используется для установки значений по умолчанию для атрибутов cookie, а также для проверки того, что cookie разрешено устанавливать.114115Изменено в версии 3.3: объект *запроса* требует атрибут [`origin_req_host`](https://python-all.ru/3.15/library/urllib.request.html#urllib.request.Request.origin_req_host) . Зависимость от устаревшего метода `get_origin_req_host()` была удалена.116117#### `CookieJar.set_policy(policy)`118119Устанавливает используемый экземпляр [`CookiePolicy`](https://python-all.ru/3.15/library/http.cookiejar.html#http.cookiejar.CookiePolicy).120121#### `CookieJar.make_cookies(response, request)`122123Возвращает последовательность объектов [`Cookie`](https://python-all.ru/3.15/library/http.cookiejar.html#http.cookiejar.Cookie), извлечённых из объекта *ответа*.124125Смотрите документацию к [`extract_cookies()`](https://python-all.ru/3.15/library/http.cookiejar.html#http.cookiejar.CookieJar.extract_cookies) для описания интерфейсов, требуемых от аргументов *ответа* и *запроса*.126127#### `CookieJar.set_cookie_if_ok(cookie, request)`128129Устанавливает [`Cookie`](https://python-all.ru/3.15/library/http.cookiejar.html#http.cookiejar.Cookie), если политика разрешает это.130131#### `CookieJar.set_cookie(cookie)`132133Устанавливает [`Cookie`](https://python-all.ru/3.15/library/http.cookiejar.html#http.cookiejar.Cookie) без проверки политики, следует ли его устанавливать.134135#### `CookieJar.clear([domain[, path[, name]]])`136137Очищает некоторые куки.138139Если вызван без аргументов, очищает все cookie. Если передан один аргумент, удаляются только cookie, принадлежащие этому *домену*. Если передано два аргумента, удаляются cookie, принадлежащие указанному *домену* и URL-*пути*. Если передано три аргумента, то удаляется cookie с указанными *доменом*, *путём* и *именем*.140141Возбуждает [`KeyError`](https://python-all.ru/3.15/library/exceptions.html#KeyError), если соответствующая cookie не найдена.142143#### `CookieJar.clear_session_cookies()`144145Удалить все сессионные куки.146147Удаляет все содержащиеся cookie, у которых атрибут [`discard`](https://python-all.ru/3.15/library/http.cookiejar.html#http.cookiejar.Cookie.discard) имеет значение true (обычно потому, что у них не было атрибута cookie `max-age` или `expires`, либо был явный атрибут cookie `discard`). Для интерактивных браузеров окончание сессии обычно соответствует закрытию окна браузера.148149Обратите внимание, что метод [`save()`](https://python-all.ru/3.15/library/http.cookiejar.html#http.cookiejar.FileCookieJar.save) в любом случае не будет сохранять сессионные куки, если только явно не передать аргумент *ignore\_discard* со значением истина.150151[`FileCookieJar`](https://python-all.ru/3.15/library/http.cookiejar.html#http.cookiejar.FileCookieJar) реализует следующие дополнительные методы:152153#### `FileCookieJar.save(filename=None, ignore_discard=False, ignore_expires=False)`154155Сохраняет куки в файл.156157Этот базовый класс вызывает исключение [`NotImplementedError`](https://python-all.ru/3.15/library/exceptions.html#NotImplementedError). Подклассы могут оставлять этот метод нереализованным.158159*filename* – имя файла, в который сохраняются куки. Если *filename* не указан, используется [`self.filename`](https://python-all.ru/3.15/library/http.cookiejar.html#http.cookiejar.FileCookieJar.filename) (значение по умолчанию которого равно значению, переданному конструктору, если таковое имеется); если `self.filename` равно `None`, возбуждается [`ValueError`](https://python-all.ru/3.15/library/exceptions.html#ValueError).160161*ignore\_discard*: сохранять даже те куки, которые помечены к удалению. *ignore\_expires*: сохранять даже куки с истекшим сроком действия.162163Файл перезаписывается, если он уже существует, при этом удаляются все куки, которые он содержит. Сохраненные куки можно восстановить позже с помощью методов [`load()`](https://python-all.ru/3.15/library/http.cookiejar.html#http.cookiejar.FileCookieJar.load) или [`revert()`](https://python-all.ru/3.15/library/http.cookiejar.html#http.cookiejar.FileCookieJar.revert).164165#### `FileCookieJar.load(filename=None, ignore_discard=False, ignore_expires=False)`166167Загружает куки из файла.168169Старые куки сохраняются, если они не перезаписываются вновь загруженными.170171Аргументы такие же, как для [`save()`](https://python-all.ru/3.15/library/http.cookiejar.html#http.cookiejar.FileCookieJar.save).172173Указанный файл должен быть в формате, понятном классу, иначе будет возбуждено [`LoadError`](https://python-all.ru/3.15/library/http.cookiejar.html#http.cookiejar.LoadError). Кроме того, может быть возбуждено [`OSError`](https://python-all.ru/3.15/library/exceptions.html#OSError), например, если файл не существует.174175Изменено в версии 3.3: [`IOError`](https://python-all.ru/3.15/library/exceptions.html#IOError) раньше возбуждалось, теперь это псевдоним [`OSError`](https://python-all.ru/3.15/library/exceptions.html#OSError).176177#### `FileCookieJar.revert(filename=None, ignore_discard=False, ignore_expires=False)`178179Очищает все куки и перезагружает куки из сохраненного файла.180181`revert()` может возбуждать те же исключения, что и [`load()`](https://python-all.ru/3.15/library/http.cookiejar.html#http.cookiejar.FileCookieJar.load). В случае неудачи состояние объекта не изменится.182183Экземпляры [`FileCookieJar`](https://python-all.ru/3.15/library/http.cookiejar.html#http.cookiejar.FileCookieJar) имеют следующие открытые атрибуты:184185#### `FileCookieJar.filename`186187Имя файла по умолчанию, в котором хранятся куки. Этому атрибуту можно присваивать значение.188189#### `FileCookieJar.delayload`190191Если истина, загружать куки с диска лениво. Этому атрибуту не следует присваивать значение. Это всего лишь подсказка, поскольку влияет только на производительность, а не на поведение (если только куки на диске не изменяются). Объект [`CookieJar`](https://python-all.ru/3.15/library/http.cookiejar.html#http.cookiejar.CookieJar) может игнорировать её. Ни один из классов [`FileCookieJar`](https://python-all.ru/3.15/library/http.cookiejar.html#http.cookiejar.FileCookieJar), входящих в стандартную библиотеку, не загружает куки лениво.192193## Подклассы FileCookieJar и взаимодействие с веб-браузерами194195Следующие подклассы [`CookieJar`](https://python-all.ru/3.15/library/http.cookiejar.html#http.cookiejar.CookieJar) предоставляются для чтения и записи.196197#### `class http.cookiejar.MozillaCookieJar(filename=None, delayload=None, policy=None)`198199[`FileCookieJar`](https://python-all.ru/3.15/library/http.cookiejar.html#http.cookiejar.FileCookieJar), который может загружать и сохранять куки на диск в формате файла Mozilla `cookies.txt` (также используется curl, браузерами Lynx и Netscape).200201> **Примечание**202>203> При этом теряется информация о cookie [**RFC 2965**](https://python-all.ru/3.15/library/http.cookiejar.html), а также о более новых или нестандартных атрибутах cookie, таких как `port`.204205> **Предупреждение**206>207> Сделайте резервную копию ваших куки перед сохранением, если у вас есть куки, потеря или повреждение которых будут нежелательны (есть некоторые тонкости, которые могут привести к небольшим изменениям в файле при полном цикле загрузки/сохранения).208209Также учтите, что куки, сохраненные во время работы Mozilla, будут перезаписаны Mozilla.210211#### `class http.cookiejar.LWPCookieJar(filename=None, delayload=None, policy=None)`212213Объект [`FileCookieJar`](https://python-all.ru/3.15/library/http.cookiejar.html#http.cookiejar.FileCookieJar), который может загружать и сохранять куки на диск в формате, совместимом с форматом файлов `Set-Cookie3` библиотеки libwww-perl. Это удобно, если нужно хранить куки в файле, читаемом человеком.214215Изменено в версии 3.8: Параметр filename поддерживает [объект, подобный пути](https://python-all.ru/3.15/glossary.html#term-path-like-object).216217## Объекты CookiePolicy218219Объекты, реализующие интерфейс [`CookiePolicy`](https://python-all.ru/3.15/library/http.cookiejar.html#http.cookiejar.CookiePolicy), имеют следующие методы:220221#### `CookiePolicy.set_ok(cookie, request)`222223Возвращает логическое значение, указывающее, следует ли принять куки от сервера.224225*cookie* – экземпляр [`Cookie`](https://python-all.ru/3.15/library/http.cookiejar.html#http.cookiejar.Cookie). *request* – объект, реализующий интерфейс, описанный в документации для [`CookieJar.extract_cookies()`](https://python-all.ru/3.15/library/http.cookiejar.html#http.cookiejar.CookieJar.extract_cookies).226227#### `CookiePolicy.return_ok(cookie, request)`228229Возвращает логическое значение, указывающее, следует ли вернуть куки серверу.230231*cookie* – экземпляр [`Cookie`](https://python-all.ru/3.15/library/http.cookiejar.html#http.cookiejar.Cookie). *request* – объект, реализующий интерфейс, описанный в документации для [`CookieJar.add_cookie_header()`](https://python-all.ru/3.15/library/http.cookiejar.html#http.cookiejar.CookieJar.add_cookie_header).232233#### `CookiePolicy.domain_return_ok(domain, request)`234235Возвращает `False`, если куки не следует возвращать, с учётом домена куки.236237Этот метод – оптимизация. Он избавляет от необходимости проверять каждый куки для определённого домена (что может потребовать чтения многих файлов). Возврат true от `domain_return_ok()` и [`path_return_ok()`](https://python-all.ru/3.15/library/http.cookiejar.html#http.cookiejar.CookiePolicy.path_return_ok) оставляет всю работу [`return_ok()`](https://python-all.ru/3.15/library/http.cookiejar.html#http.cookiejar.CookiePolicy.return_ok).238239Если `domain_return_ok()` возвращает true для домена куки, [`path_return_ok()`](https://python-all.ru/3.15/library/http.cookiejar.html#http.cookiejar.CookiePolicy.path_return_ok) вызывается для пути куки. В противном случае `path_return_ok()` и [`return_ok()`](https://python-all.ru/3.15/library/http.cookiejar.html#http.cookiejar.CookiePolicy.return_ok) никогда не вызываются для этого домена куки. Если `path_return_ok()` возвращает true, `return_ok()` вызывается с объектом [`Cookie`](https://python-all.ru/3.15/library/http.cookiejar.html#http.cookiejar.Cookie) для полной проверки. В противном случае `return_ok()` никогда не вызывается для этого пути куки.240241Обратите внимание, что `domain_return_ok()` вызывается для каждого *домена куки*, а не только для *домена запроса*. Например, функция может вызываться как с `".example.com"`, так и с `"www.example.com"`, если домен запроса – `"www.example.com"`. То же самое относится к [`path_return_ok()`](https://python-all.ru/3.15/library/http.cookiejar.html#http.cookiejar.CookiePolicy.path_return_ok).242243Аргумент *request* описан в документации [`return_ok()`](https://python-all.ru/3.15/library/http.cookiejar.html#http.cookiejar.CookiePolicy.return_ok).244245#### `CookiePolicy.path_return_ok(path, request)`246247Возвращает `False`, если куки не следует возвращать, с учётом пути куки.248249См. документацию [`domain_return_ok()`](https://python-all.ru/3.15/library/http.cookiejar.html#http.cookiejar.CookiePolicy.domain_return_ok).250251Помимо реализации методов, описанных выше, реализации интерфейса [`CookiePolicy`](https://python-all.ru/3.15/library/http.cookiejar.html#http.cookiejar.CookiePolicy) должны также предоставлять следующие атрибуты, указывающие, какие протоколы следует использовать и как. Все эти атрибуты могут быть изменены (присвоены).252253#### `CookiePolicy.netscape`254255Реализация протокола Netscape.256257#### `CookiePolicy.rfc2965`258259Реализация протокола [**RFC 2965**](https://python-all.ru/3.15/library/http.cookiejar.html).260261#### `CookiePolicy.hide_cookie2`262263Не добавлять заголовок *Cookie2* к запросам (наличие этого заголовка указывает серверу, что мы понимаем куки [**RFC 2965**](https://python-all.ru/3.15/library/http.cookiejar.html)).264265Самый удобный способ определить класс [`CookiePolicy`](https://python-all.ru/3.15/library/http.cookiejar.html#http.cookiejar.CookiePolicy) – это создать подкласс от [`DefaultCookiePolicy`](https://python-all.ru/3.15/library/http.cookiejar.html#http.cookiejar.DefaultCookiePolicy) и переопределить некоторые (или все) методы выше. Сам `CookiePolicy` может использоваться как «нулевая политика», позволяющая устанавливать и принимать любые куки (вряд ли это будет полезно).266267## Объекты DefaultCookiePolicy268269Реализует стандартные правила принятия и возврата куки.270271Охвачены как куки [**RFC 2965**](https://python-all.ru/3.15/library/http.cookiejar.html), так и Netscape. Обработка RFC 2965 отключена по умолчанию.272273Самый простой способ создать свою политику – переопределить этот класс и вызывать его методы в ваших переопределённых реализациях перед добавлением собственных дополнительных проверок:274275```python276import http.cookiejar277class MyCookiePolicy(http.cookiejar.DefaultCookiePolicy):278    def set_ok(self, cookie, request):279        if not http.cookiejar.DefaultCookiePolicy.set_ok(self, cookie, request):280            return False281        if i_dont_want_to_store_this_cookie(cookie):282            return False283        return True284```285286Помимо возможностей, необходимых для реализации интерфейса [`CookiePolicy`](https://python-all.ru/3.15/library/http.cookiejar.html#http.cookiejar.CookiePolicy), этот класс позволяет блокировать и разрешать домены при установке и получении куки. Также есть несколько переключателей строгости, которые позволяют немного ужесточить довольно свободные правила протокола Netscape (ценой блокировки некоторых безвредных куки).287288Предусмотрены списки блокировки и разрешения доменов (оба отключены по умолчанию). В установке и возврате куки участвуют только домены, отсутствующие в списке блокировки и присутствующие в списке разрешения (если список разрешения активен). Используйте аргумент конструктора *blocked\_domains*, методы [`blocked_domains()`](https://python-all.ru/3.15/library/http.cookiejar.html#http.cookiejar.DefaultCookiePolicy.blocked_domains) и [`set_blocked_domains()`](https://python-all.ru/3.15/library/http.cookiejar.html#http.cookiejar.DefaultCookiePolicy.set_blocked_domains) (а также соответствующие аргумент и методы для *allowed\_domains*). Если вы задали список разрешения, его можно снова отключить, присвоив значение `None`.289290Домены в списках блокировки или разрешения, которые не начинаются с точки, должны в точности совпадать с доменом 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 – нет.291292[`DefaultCookiePolicy`](https://python-all.ru/3.15/library/http.cookiejar.html#http.cookiejar.DefaultCookiePolicy) реализует следующие дополнительные методы:293294#### `DefaultCookiePolicy.blocked_domains()`295296Возвращает последовательность заблокированных доменов (в виде кортежа).297298#### `DefaultCookiePolicy.set_blocked_domains(blocked_domains)`299300Устанавливает последовательность заблокированных доменов.301302#### `DefaultCookiePolicy.is_blocked(domain)`303304Возвращает `True`, если *domain* находится в списке блокировки для установки или получения cookies.305306#### `DefaultCookiePolicy.allowed_domains()`307308Возвращает `None` или последовательность разрешённых доменов (в виде кортежа).309310#### `DefaultCookiePolicy.set_allowed_domains(allowed_domains)`311312Устанавливает последовательность разрешённых доменов или `None`.313314#### `DefaultCookiePolicy.is_not_allowed(domain)`315316Возвращает `True`, если *domain* отсутствует в списке разрешения для установки или получения cookies.317318Экземпляры [`DefaultCookiePolicy`](https://python-all.ru/3.15/library/http.cookiejar.html#http.cookiejar.DefaultCookiePolicy) имеют следующие атрибуты, все они инициализируются из аргументов конструктора с теми же именами, и всем им можно присваивать значения.319320#### `DefaultCookiePolicy.rfc2109_as_netscape`321322Если истина, запрашивает, чтобы экземпляр [`CookieJar`](https://python-all.ru/3.15/library/http.cookiejar.html#http.cookiejar.CookieJar) понижал [**RFC 2109**](https://python-all.ru/3.15/library/http.cookiejar.html) cookies (то есть cookies, полученные в заголовке *Set-Cookie* с атрибутом version cookie равным 1) до cookies Netscape, устанавливая атрибут version экземпляра [`Cookie`](https://python-all.ru/3.15/library/http.cookiejar.html#http.cookiejar.Cookie) в 0. Значение по умолчанию – `None`, в этом случае cookies RFC 2109 понижаются только тогда, когда обработка [**RFC 2965**](https://python-all.ru/3.15/library/http.cookiejar.html) отключена. Поэтому cookies RFC 2109 понижаются по умолчанию.323324Общие переключатели строгости:325326#### `DefaultCookiePolicy.strict_domain`327328Не разрешает сайтам устанавливать двухкомпонентные домены с национальными доменами верхнего уровня, такими как `.co.uk`, `.gov.uk`, `.co.nz` и т.д. Это далеко от совершенства и не гарантирует работу!329330[**RFC 2965**](https://python-all.ru/3.15/library/http.cookiejar.html) переключатели строгости протокола:331332#### `DefaultCookiePolicy.strict_rfc2965_unverifiable`333334Следует правилам [**RFC 2965**](https://python-all.ru/3.15/library/http.cookiejar.html) для непроверяемых транзакций (обычно непроверяемая транзакция – это результат перенаправления или запроса изображения, размещённого на другом сайте). Если это ложь, cookies *никогда* не блокируются на основе проверяемости.335336Переключатели строгости протокола Netscape:337338#### `DefaultCookiePolicy.strict_ns_unverifiable`339340Применяет правила [**RFC 2965**](https://python-all.ru/3.15/library/http.cookiejar.html) для непроверяемых транзакций даже к cookies Netscape.341342#### `DefaultCookiePolicy.strict_ns_domain`343344Флаги, указывающие, насколько строгими должны быть правила сопоставления доменов для cookies Netscape. Допустимые значения приведены ниже.345346#### `DefaultCookiePolicy.strict_ns_set_initial_dollar`347348Игнорирует cookies в заголовках Set-Cookie, имена которых начинаются с `'$'`.349350#### `DefaultCookiePolicy.strict_ns_set_path`351352Не разрешать установку куки, путь которых не соответствует URI запроса.353354[`strict_ns_domain`](https://python-all.ru/3.15/library/http.cookiejar.html#http.cookiejar.DefaultCookiePolicy.strict_ns_domain) – это набор флагов. Его значение формируется путём логического ИЛИ (например, `DomainStrictNoDots|DomainStrictNonDomain` означает, что установлены оба флага).355356#### `DefaultCookiePolicy.DomainStrictNoDots`357358При установке cookie префикс хоста не должен содержать точку (например, `www.foo.bar.com` не может установить cookie для `.bar.com`, потому что `www.foo` содержит точку).359360#### `DefaultCookiePolicy.DomainStrictNonDomain`361362Cookie, которые явно не указали атрибут `domain`, могут возвращаться только домену, совпадающему с доменом, установившим cookie (например, `spam.example.com` не получит cookie от `example.com`, не имевшие атрибута `domain`).363364#### `DefaultCookiePolicy.DomainRFC2965Match`365366При установке куки требуется полное [**RFC 2965**](https://python-all.ru/3.15/library/http.cookiejar.html) соответствие доменов.367368Следующие атрибуты предоставлены для удобства и представляют собой наиболее полезные комбинации указанных выше флагов:369370#### `DefaultCookiePolicy.DomainLiberal`371372Эквивалентно 0 (то есть все указанные выше флаги строгости доменов Netscape отключены).373374#### `DefaultCookiePolicy.DomainStrict`375376Эквивалентно `DomainStrictNoDots|DomainStrictNonDomain`.377378## Объекты Cookie379380Экземпляры [`Cookie`](https://python-all.ru/3.15/library/http.cookiejar.html#http.cookiejar.Cookie) имеют атрибуты Python, примерно соответствующие стандартным атрибутам cookie, определённым в различных стандартах cookies. Это соответствие не является взаимно однозначным, так как существуют сложные правила назначения значений по умолчанию, атрибуты `max-age` и `expires` содержат эквивалентную информацию, и cookie [**RFC 2109**](https://python-all.ru/3.15/library/http.cookiejar.html) могут быть 'понижены' с помощью `http.cookiejar` с версии 1 до версии 0 (Netscape) cookies.381382Присваивание этим атрибутам должно быть необходимо только в редких случаях, например в методе [`CookiePolicy`](https://python-all.ru/3.15/library/http.cookiejar.html#http.cookiejar.CookiePolicy). Класс не обеспечивает внутренней согласованности, поэтому следует понимать, что делается при таком присваивании.383384#### `Cookie.version`385386Целое число или `None`. Cookie Netscape имеют [`version`](https://python-all.ru/3.15/library/http.cookiejar.html#http.cookiejar.Cookie.version) 0. Cookie [**RFC 2965**](https://python-all.ru/3.15/library/http.cookiejar.html) и [**RFC 2109**](https://python-all.ru/3.15/library/http.cookiejar.html) имеют атрибут cookie `version` равный 1. Однако обратите внимание, что `http.cookiejar` может 'понижать' RFC 2109 cookie до Netscape cookie, и в этом случае `version` равен 0.387388#### `Cookie.name`389390Имя cookie (строка).391392#### `Cookie.value`393394Значение cookie (строка) или `None`.395396#### `Cookie.port`397398Строка, представляющая порт или набор портов (например, ‘80’ или ‘80,8080’), или `None`.399400#### `Cookie.domain`401402Домен cookie (строка).403404#### `Cookie.path`405406Путь cookie (строка, например `'/acme/rocket_launchers'`).407408#### `Cookie.secure`409410`True`, если cookie должна возвращаться только через защищённое соединение.411412#### `Cookie.expires`413414Целочисленная дата истечения срока в секундах от начала эпохи или `None`. См. также метод [`is_expired()`](https://python-all.ru/3.15/library/http.cookiejar.html#http.cookiejar.Cookie.is_expired).415416#### `Cookie.discard`417418`True`, если это сессионный cookie.419420#### `Cookie.comment`421422Строковый комментарий от сервера, поясняющий назначение этого cookie, или `None`.423424#### `Cookie.comment_url`425426URL, ведущий на комментарий от сервера, поясняющий назначение этого cookie, или `None`.427428#### `Cookie.rfc2109`429430`True`, если этот cookie был получен как [**RFC 2109**](https://python-all.ru/3.15/library/http.cookiejar.html) cookie (то есть cookie поступил в заголовке *Set-Cookie*, и значение атрибута Version cookie-attribute в этом заголовке было равно 1). Этот атрибут существует потому, что `http.cookiejar` может «понижать» RFC 2109 cookie до Netscape cookie, и в таком случае [`version`](https://python-all.ru/3.15/library/http.cookiejar.html#http.cookiejar.Cookie.version) равно 0.431432#### `Cookie.port_specified`433434`True`, если порт или набор портов был явно указан сервером (в заголовке *Set-Cookie* / *Set-Cookie2*).435436#### `Cookie.domain_specified`437438`True`, если домен был явно указан сервером.439440#### `Cookie.domain_initial_dot`441442`True`, если домен, явно указанный сервером, начинался с точки (`'.'`).443444Cookie могут иметь дополнительные нестандартные атрибуты cookie. Доступ к ним можно получить с помощью следующих методов:445446#### `Cookie.has_nonstandard_attr(name)`447448Возвращает `True`, если cookie имеет указанный атрибут cookie.449450#### `Cookie.get_nonstandard_attr(name, default=None)`451452Если cookie имеет указанный атрибут cookie, возвращает его значение. В противном случае возвращает *default*.453454#### `Cookie.set_nonstandard_attr(name, value)`455456Устанавливает значение указанного атрибута cookie.457458Класс [`Cookie`](https://python-all.ru/3.15/library/http.cookiejar.html#http.cookiejar.Cookie) также определяет следующий метод:459460#### `Cookie.is_expired(now=None)`461462`True`, если срок действия cookie истёк (прошло время, указанное сервером для истечения). Если передан *now* (в секундах с начала эпохи), возвращается, истёк ли срок действия cookie на указанный момент времени.463464## Примеры465466Первый пример показывает наиболее распространённое использование `http.cookiejar`:467468```python469import http.cookiejar, urllib.request470cj = http.cookiejar.CookieJar()471opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj))472r = opener.open("http://example.com/")473```474475Этот пример иллюстрирует, как открыть URL с использованием ваших куки Netscape, Mozilla или Lynx (предполагается соглашение Unix/Netscape о местоположении файла куки):476477```python478import os, http.cookiejar, urllib.request479cj = http.cookiejar.MozillaCookieJar()480cj.load(os.path.join(os.path.expanduser("~"), ".netscape", "cookies.txt"))481opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj))482r = opener.open("http://example.com/")483```484485Следующий пример иллюстрирует использование [`DefaultCookiePolicy`](https://python-all.ru/3.15/library/http.cookiejar.html#http.cookiejar.DefaultCookiePolicy). Включите [**RFC 2965**](https://python-all.ru/3.15/library/http.cookiejar.html) куки, будьте более строги к доменам при установке и возврате куки Netscape и заблокируйте некоторые домены, чтобы они не могли устанавливать куки или возвращать их:486487```python488import urllib.request489from http.cookiejar import CookieJar, DefaultCookiePolicy490policy = DefaultCookiePolicy(491    rfc2965=True, strict_ns_domain=Policy.DomainStrict,492    blocked_domains=["ads.net", ".ads.net"])493cj = CookieJar(policy)494opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj))495r = opener.open("http://example.com/")496```497