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

http.cookiejar – Обработка cookie для HTTP-клиентовhttp.cookiejar – Cookie handling for HTTP clients

Исходный код: Lib/http/cookiejar.py


Модуль http.cookiejar определяет классы для автоматической обработки HTTP-куки. Он полезен для доступа к веб-сайтам, которые требуют, чтобы небольшие фрагменты данных – куки – устанавливались на клиентской машине HTTP-ответом веб-сервера, а затем возвращались серверу в последующих HTTP-запросах.

Обрабатываются как обычный протокол Netscape cookie, так и протокол, определённый в RFC 2965. Обработка RFC 2965 по умолчанию выключена. RFC 2109 куки разбираются как Netscape-куки и впоследствии обрабатываются либо как Netscape, либо как RFC 2965 в зависимости от действующей «политики». Обратите внимание, что подавляющее большинство куки в интернете – это Netscape-куки. http.cookiejar пытается следовать де-факто протоколу Netscape cookie (который существенно отличается от изложенного в оригинальной спецификации Netscape), включая учёт атрибутов cookie max-age и port, введённых в RFC 2965.

Примечание

Различные именованные параметры, встречающиеся в заголовках Set-Cookie и Set-Cookie2 (например, domain и expires), по традиции называются атрибутами. Чтобы отличать их от атрибутов Python, в документации этого модуля используется термин cookie-атрибут.

Модуль определяет следующее исключение:

exception http.cookiejar.LoadError

Экземпляры FileCookieJar вызывают это исключение при неудачной загрузке куки из файла. LoadError является подклассом OSError.

Изменено в версии 3.3: LoadError раньше был подтипом IOError, который теперь является псевдонимом OSError.

Предоставляются следующие классы:

class http.cookiejar.CookieJar(policy=None)

policy – это объект, реализующий интерфейс CookiePolicy.

Класс CookieJar хранит HTTP-куки. Он извлекает куки из HTTP-запросов и возвращает их в HTTP-ответах. Экземпляры CookieJar автоматически удаляют устаревшие куки при необходимости. Подклассы также отвечают за сохранение и загрузку куки из файла или базы данных.

class http.cookiejar.FileCookieJar(filename=None, delayload=None, policy=None)

policy – это объект, реализующий интерфейс CookiePolicy. Остальные аргументы описаны в документации соответствующих атрибутов.

CookieJar, который может загружать куки из файла на диске и, возможно, сохранять их туда. Куки НЕ загружаются из указанного файла до тех пор, пока не будет вызван метод load() или revert(). Подклассы этого класса описаны в разделе Подклассы FileCookieJar и взаимодействие с веб-браузерами.

Не следует инициализировать напрямую – используйте вместо этого его подклассы, перечисленные ниже.

Изменено в версии 3.8: Параметр filename поддерживает объект, подобный пути.

class http.cookiejar.CookiePolicy

Этот класс отвечает за принятие решения о том, следует ли принять каждый куки от сервера / вернуть его серверу.

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'))

Аргументы конструктора должны передаваться только как именованные аргументы. blocked_domains – это последовательность доменных имён, с которых мы никогда не принимаем куки и которым никогда не возвращаем куки. allowed_domains, если не равно None, – это последовательность единственных доменов, для которых мы принимаем и возвращаем куки. secure_protocols – это последовательность протоколов, для которых могут быть добавлены защищённые куки. По умолчанию https и wss (защищённый вебсокет) считаются защищёнными протоколами. Остальные аргументы описаны в документации объектов CookiePolicy и DefaultCookiePolicy.

DefaultCookiePolicy реализует стандартные правила приёма/отклонения для Netscape и RFC 2965 куки. По умолчанию куки RFC 2109 (то есть куки, полученные в заголовке Set-Cookie с атрибутом версии cookie, равным 1) обрабатываются по правилам RFC 2965. Однако если обработка RFC 2965 отключена или rfc2109_as_netscape равно True, куки RFC 2109 «понижаются» экземпляром CookieJar до Netscape-куки путём установки атрибута version экземпляра Cookie в 0. DefaultCookiePolicy также предоставляет некоторые параметры для тонкой настройки политики.

class http.cookiejar.Cookie

Этот класс представляет куки Netscape, RFC 2109 и RFC 2965. Не предполагается, что пользователи http.cookiejar будут создавать собственные экземпляры Cookie. Вместо этого при необходимости следует вызвать make_cookies() на экземпляре CookieJar.

См. также

Модуль urllib.request

Открытие URL с автоматической обработкой куки.

Модуль http.cookies

Классы HTTP-куки, в основном полезные для серверного кода. Модули http.cookiejar и http.cookies не зависят друг от друга.

https://curl.se/rfc/cookie_spec.html

Спецификация оригинального протокола Netscape cookie. Хотя это всё ещё доминирующий протокол, «протокол Netscape cookie», реализованный всеми основными браузерами (и http.cookiejar), лишь отдалённо напоминает тот, что описан в cookie_spec.html.

RFC 2109 – Механизм управления состоянием HTTP

Заменён RFC 2965. Использует Set-Cookie с version=1.

RFC 2965 – Механизм управления состоянием HTTP

Протокол Netscape с исправленными ошибками. Использует Set-Cookie2 вместо Set-Cookie. Широко не используется.

https://kristol.org/cookie/errata.html

Незавершённая errata к RFC 2965.

RFC 2964 – Использование управления состоянием HTTP

Объекты CookieJar и FileCookieJarCookieJar and FileCookieJar objects

Объекты CookieJar поддерживают протокол итератора для итерации по содержащимся объектам Cookie.

CookieJar имеет следующие методы:

Добавляет правильный заголовок Cookie к запросу.

Если политика разрешает (то есть атрибуты rfc2965 и hide_cookie2 экземпляра CookieJar CookiePolicy имеют значения true и false соответственно), заголовок Cookie2 также добавляется, когда это уместно.

Объект запроса (обычно экземпляр urllib.request.Request) должен поддерживать методы get_full_url(), has_header(), get_header(), header_items(), add_unredirected_header() и атрибуты host, type, unverifiable и origin_req_host, как описано в urllib.request.

Изменено в версии 3.3: объект запроса требует атрибут origin_req_host . Зависимость от устаревшего метода get_origin_req_host() была удалена.

CookieJar.extract_cookies(response, request)

Извлекает куки из HTTP-ответа и сохраняет их в CookieJar, где это разрешено политикой.

CookieJar будет искать допустимые заголовки Set-Cookie и Set-Cookie2 в аргументе ответа, и сохранять cookie соответствующим образом (с учётом одобрения метода CookiePolicy.set_ok()).

Объект ответа (обычно результат вызова urllib.request.urlopen() или подобного) должен поддерживать метод info(), который возвращает экземпляр email.message.Message.

Объект запроса (обычно экземпляр urllib.request.Request) должен поддерживать метод get_full_url() и атрибуты host, unverifiable и origin_req_host, как описано в urllib.request. Запрос используется для установки значений по умолчанию для атрибутов cookie, а также для проверки того, что cookie разрешено устанавливать.

Изменено в версии 3.3: объект запроса требует атрибут origin_req_host . Зависимость от устаревшего метода get_origin_req_host() была удалена.

CookieJar.set_policy(policy)

Устанавливает используемый экземпляр CookiePolicy.

CookieJar.make_cookies(response, request)

Возвращает последовательность объектов Cookie, извлечённых из объекта ответа.

Смотрите документацию к extract_cookies() для описания интерфейсов, требуемых от аргументов ответа и запроса.

Устанавливает Cookie, если политика разрешает это.

Устанавливает Cookie без проверки политики, следует ли его устанавливать.

CookieJar.clear([domain[, path[, name]]])

Очищает некоторые куки.

Если вызван без аргументов, очищает все cookie. Если передан один аргумент, удаляются только cookie, принадлежащие этому домену. Если передано два аргумента, удаляются cookie, принадлежащие указанному домену и URL-пути. Если передано три аргумента, то удаляется cookie с указанными доменом, путём и именем.

Возбуждает KeyError, если соответствующая cookie не найдена.

CookieJar.clear_session_cookies()

Удалить все сессионные куки.

Удаляет все содержащиеся cookie, у которых атрибут discard имеет значение true (обычно потому, что у них не было атрибута cookie max-age или expires, либо был явный атрибут cookie discard). Для интерактивных браузеров окончание сессии обычно соответствует закрытию окна браузера.

Обратите внимание, что метод save() в любом случае не будет сохранять сессионные куки, если только явно не передать аргумент ignore_discard со значением истина.

FileCookieJar реализует следующие дополнительные методы:

FileCookieJar.save(filename=None, ignore_discard=False, ignore_expires=False)

Сохраняет куки в файл.

Этот базовый класс вызывает исключение NotImplementedError. Подклассы могут оставлять этот метод нереализованным.

filename – имя файла, в который сохраняются куки. Если filename не указан, используется self.filename (значение по умолчанию которого равно значению, переданному конструктору, если таковое имеется); если self.filename равно None, возбуждается ValueError.

ignore_discard: сохранять даже те куки, которые помечены к удалению. ignore_expires: сохранять даже куки с истекшим сроком действия.

Файл перезаписывается, если он уже существует, при этом удаляются все куки, которые он содержит. Сохраненные куки можно восстановить позже с помощью методов load() или revert().

FileCookieJar.load(filename=None, ignore_discard=False, ignore_expires=False)

Загружает куки из файла.

Старые куки сохраняются, если они не перезаписываются вновь загруженными.

Аргументы такие же, как для save().

Указанный файл должен быть в формате, понятном классу, иначе будет возбуждено LoadError. Кроме того, может быть возбуждено OSError, например, если файл не существует.

Изменено в версии 3.3: IOError раньше возбуждалось, теперь это псевдоним OSError.

FileCookieJar.revert(filename=None, ignore_discard=False, ignore_expires=False)

Очищает все куки и перезагружает куки из сохраненного файла.

revert() может возбуждать те же исключения, что и load(). В случае неудачи состояние объекта не изменится.

Экземпляры FileCookieJar имеют следующие открытые атрибуты:

FileCookieJar.filename

Имя файла по умолчанию, в котором хранятся куки. Этому атрибуту можно присваивать значение.

FileCookieJar.delayload

Если истина, загружать куки с диска лениво. Этому атрибуту не следует присваивать значение. Это всего лишь подсказка, поскольку влияет только на производительность, а не на поведение (если только куки на диске не изменяются). Объект CookieJar может игнорировать её. Ни один из классов FileCookieJar, входящих в стандартную библиотеку, не загружает куки лениво.

Подклассы FileCookieJar и взаимодействие с веб-браузерамиFileCookieJar subclasses and co-operation with web browsers

Следующие подклассы CookieJar предоставляются для чтения и записи.

class http.cookiejar.MozillaCookieJar(filename=None, delayload=None, policy=None)

FileCookieJar, который может загружать и сохранять куки на диск в формате файла Mozilla cookies.txt (также используется curl, браузерами Lynx и Netscape).

Примечание

При этом теряется информация о cookie RFC 2965, а также о более новых или нестандартных атрибутах cookie, таких как port.

Предупреждение

Сделайте резервную копию ваших куки перед сохранением, если у вас есть куки, потеря или повреждение которых будут нежелательны (есть некоторые тонкости, которые могут привести к небольшим изменениям в файле при полном цикле загрузки/сохранения).

Также учтите, что куки, сохраненные во время работы Mozilla, будут перезаписаны Mozilla.

class http.cookiejar.LWPCookieJar(filename=None, delayload=None, policy=None)

Объект FileCookieJar, который может загружать и сохранять куки на диск в формате, совместимом с форматом файлов Set-Cookie3 библиотеки libwww-perl. Это удобно, если нужно хранить куки в файле, читаемом человеком.

Изменено в версии 3.8: Параметр filename поддерживает объект, подобный пути.

Объекты CookiePolicyCookiePolicy objects

Объекты, реализующие интерфейс CookiePolicy, имеют следующие методы:

CookiePolicy.set_ok(cookie, request)

Возвращает логическое значение, указывающее, следует ли принять куки от сервера.

cookie – экземпляр Cookie. request – объект, реализующий интерфейс, описанный в документации для CookieJar.extract_cookies().

CookiePolicy.return_ok(cookie, request)

Возвращает логическое значение, указывающее, следует ли вернуть куки серверу.

cookie – экземпляр Cookie. request – объект, реализующий интерфейс, описанный в документации для CookieJar.add_cookie_header().

CookiePolicy.domain_return_ok(domain, request)

Возвращает False, если куки не следует возвращать, с учётом домена куки.

Этот метод – оптимизация. Он избавляет от необходимости проверять каждый куки для определённого домена (что может потребовать чтения многих файлов). Возврат true от domain_return_ok() и path_return_ok() оставляет всю работу return_ok().

Если domain_return_ok() возвращает true для домена куки, path_return_ok() вызывается для пути куки. В противном случае path_return_ok() и return_ok() никогда не вызываются для этого домена куки. Если path_return_ok() возвращает true, return_ok() вызывается с объектом Cookie для полной проверки. В противном случае return_ok() никогда не вызывается для этого пути куки.

Обратите внимание, что domain_return_ok() вызывается для каждого домена куки, а не только для домена запроса. Например, функция может вызываться как с ".example.com", так и с "www.example.com", если домен запроса – "www.example.com". То же самое относится к path_return_ok().

Аргумент request описан в документации return_ok().

CookiePolicy.path_return_ok(path, request)

Возвращает False, если куки не следует возвращать, с учётом пути куки.

См. документацию domain_return_ok().

Помимо реализации методов, описанных выше, реализации интерфейса CookiePolicy должны также предоставлять следующие атрибуты, указывающие, какие протоколы следует использовать и как. Все эти атрибуты могут быть изменены (присвоены).

CookiePolicy.netscape

Реализация протокола Netscape.

CookiePolicy.rfc2965

Реализация протокола RFC 2965.

CookiePolicy.hide_cookie2

Не добавлять заголовок Cookie2 к запросам (наличие этого заголовка указывает серверу, что мы понимаем куки RFC 2965).

Самый удобный способ определить класс CookiePolicy – это создать подкласс от DefaultCookiePolicy и переопределить некоторые (или все) методы выше. Сам CookiePolicy может использоваться как «нулевая политика», позволяющая устанавливать и принимать любые куки (вряд ли это будет полезно).

Объекты DefaultCookiePolicyDefaultCookiePolicy objects

Реализует стандартные правила принятия и возврата куки.

Охвачены как куки RFC 2965, так и Netscape. Обработка RFC 2965 отключена по умолчанию.

Самый простой способ создать свою политику – переопределить этот класс и вызывать его методы в ваших переопределённых реализациях перед добавлением собственных дополнительных проверок:

import http.cookiejar
class MyCookiePolicy(http.cookiejar.DefaultCookiePolicy):
    def set_ok(self, cookie, request):
        if not http.cookiejar.DefaultCookiePolicy.set_ok(self, cookie, request):
            return False
        if i_dont_want_to_store_this_cookie(cookie):
            return False
        return True

Помимо возможностей, необходимых для реализации интерфейса CookiePolicy, этот класс позволяет блокировать и разрешать домены при установке и получении куки. Также есть несколько переключателей строгости, которые позволяют немного ужесточить довольно свободные правила протокола Netscape (ценой блокировки некоторых безвредных куки).

Предусмотрены списки блокировки и разрешения доменов (оба отключены по умолчанию). В установке и возврате куки участвуют только домены, отсутствующие в списке блокировки и присутствующие в списке разрешения (если список разрешения активен). Используйте аргумент конструктора blocked_domains, методы blocked_domains() и set_blocked_domains() (а также соответствующие аргумент и методы для allowed_domains). Если вы задали список разрешения, его можно снова отключить, присвоив значение None.

Домены в списках блокировки или разрешения, которые не начинаются с точки, должны в точности совпадать с доменом 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 – нет.

DefaultCookiePolicy реализует следующие дополнительные методы:

DefaultCookiePolicy.blocked_domains()

Возвращает последовательность заблокированных доменов (в виде кортежа).

DefaultCookiePolicy.set_blocked_domains(blocked_domains)

Устанавливает последовательность заблокированных доменов.

DefaultCookiePolicy.is_blocked(domain)

Возвращает True, если domain находится в списке блокировки для установки или получения cookies.

DefaultCookiePolicy.allowed_domains()

Возвращает None или последовательность разрешённых доменов (в виде кортежа).

DefaultCookiePolicy.set_allowed_domains(allowed_domains)

Устанавливает последовательность разрешённых доменов или None.

DefaultCookiePolicy.is_not_allowed(domain)

Возвращает True, если domain отсутствует в списке разрешения для установки или получения cookies.

Экземпляры DefaultCookiePolicy имеют следующие атрибуты, все они инициализируются из аргументов конструктора с теми же именами, и всем им можно присваивать значения.

DefaultCookiePolicy.rfc2109_as_netscape

Если истина, запрашивает, чтобы экземпляр CookieJar понижал RFC 2109 cookies (то есть cookies, полученные в заголовке Set-Cookie с атрибутом version cookie равным 1) до cookies Netscape, устанавливая атрибут version экземпляра Cookie в 0. Значение по умолчанию – None, в этом случае cookies RFC 2109 понижаются только тогда, когда обработка RFC 2965 отключена. Поэтому cookies RFC 2109 понижаются по умолчанию.

Общие переключатели строгости:

DefaultCookiePolicy.strict_domain

Не разрешает сайтам устанавливать двухкомпонентные домены с национальными доменами верхнего уровня, такими как .co.uk, .gov.uk, .co.nz и т.д. Это далеко от совершенства и не гарантирует работу!

RFC 2965 переключатели строгости протокола:

DefaultCookiePolicy.strict_rfc2965_unverifiable

Следует правилам RFC 2965 для непроверяемых транзакций (обычно непроверяемая транзакция – это результат перенаправления или запроса изображения, размещённого на другом сайте). Если это ложь, cookies никогда не блокируются на основе проверяемости.

Переключатели строгости протокола Netscape:

DefaultCookiePolicy.strict_ns_unverifiable

Применяет правила RFC 2965 для непроверяемых транзакций даже к cookies Netscape.

DefaultCookiePolicy.strict_ns_domain

Флаги, указывающие, насколько строгими должны быть правила сопоставления доменов для cookies Netscape. Допустимые значения приведены ниже.

DefaultCookiePolicy.strict_ns_set_initial_dollar

Игнорирует cookies в заголовках Set-Cookie, имена которых начинаются с '$'.

DefaultCookiePolicy.strict_ns_set_path

Не разрешать установку куки, путь которых не соответствует URI запроса.

strict_ns_domain – это набор флагов. Его значение формируется путём логического ИЛИ (например, DomainStrictNoDots|DomainStrictNonDomain означает, что установлены оба флага).

DefaultCookiePolicy.DomainStrictNoDots

При установке cookie префикс хоста не должен содержать точку (например, www.foo.bar.com не может установить cookie для .bar.com, потому что www.foo содержит точку).

DefaultCookiePolicy.DomainStrictNonDomain

Cookie, которые явно не указали атрибут domain, могут возвращаться только домену, совпадающему с доменом, установившим cookie (например, spam.example.com не получит cookie от example.com, не имевшие атрибута domain).

DefaultCookiePolicy.DomainRFC2965Match

При установке куки требуется полное RFC 2965 соответствие доменов.

Следующие атрибуты предоставлены для удобства и представляют собой наиболее полезные комбинации указанных выше флагов:

DefaultCookiePolicy.DomainLiberal

Эквивалентно 0 (то есть все указанные выше флаги строгости доменов Netscape отключены).

DefaultCookiePolicy.DomainStrict

Эквивалентно DomainStrictNoDots|DomainStrictNonDomain.

ПримерыExamples

Первый пример показывает наиболее распространённое использование http.cookiejar:

import http.cookiejar, urllib.request
cj = http.cookiejar.CookieJar()
opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj))
r = opener.open("http://example.com/")

Этот пример иллюстрирует, как открыть URL с использованием ваших куки Netscape, Mozilla или Lynx (предполагается соглашение Unix/Netscape о местоположении файла куки):

import os, http.cookiejar, urllib.request
cj = http.cookiejar.MozillaCookieJar()
cj.load(os.path.join(os.path.expanduser("~"), ".netscape", "cookies.txt"))
opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj))
r = opener.open("http://example.com/")

Следующий пример иллюстрирует использование DefaultCookiePolicy. Включите RFC 2965 куки, будьте более строги к доменам при установке и возврате куки Netscape и заблокируйте некоторые домены, чтобы они не могли устанавливать куки или возвращать их:

import urllib.request
from http.cookiejar import CookieJar, DefaultCookiePolicy
policy = DefaultCookiePolicy(
    rfc2965=True, strict_ns_domain=Policy.DomainStrict,
    blocked_domains=["ads.net", ".ads.net"])
cj = CookieJar(policy)
opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj))
r = opener.open("http://example.com/")