http.cookiejar — Обработка cookie для HTTP-клиентов¶
Исходный код: Lib/http/cookiejar.py
Модуль http.cookiejar определяет классы для автоматической обработки HTTP-файлов
cookie. Он полезен для доступа к веб-сайтам, для которых требуются небольшие
порции данных - cookies - которые должны быть установлены на клиентском
компьютере с помощью HTTP-ответа с веб-сервера, а затем возвращенный на сервер в
последующих HTTP-запросах.
Обрабатываются как обычный протокол «cookie» Netscape, так и протокол,
определенный функцией «RFC 2965». Обработка RFC 2965 по умолчанию отключена.
RFC 2109 файлы cookie анализируются как файлы cookie Netscape и впоследствии
обрабатываются как файлы cookie Netscape или RFC 2965 в соответствии с
действующей политикой. Следует отметить, что подавляющее большинство файлов
cookie в интернете - это файлы cookie Netscape. http.cookiejar пытается следовать
фактическому протоколу куки Netscape (который отличается существенно от
изложенного в оригинальной спецификации Netscape), включая то, чтобы принимать
во внимание max-age и cookies-атрибуты port, начатое с RFC 2965.
Примечание
Различные именованные параметры, найденные в заголовках Set-Cookie и Set-Cookie2
(например, domain и expires) обычно называют attributes. Чтобы отличить
их от Python атрибуты, в документации для этого модуля используется термин
cookie-attribute.
Модуль определяет следующее исключение:
сущности
FileCookieJarподнимают это исключение на отказе загрузить cookies из файла.LoadErrorявляется подклассOSError.
Предусмотрены следующие классы:
policy является объектом, реализующим интерфейс
CookiePolicy.Класс
CookieJarхранит файлы cookie HTTP. Он извлекает файлы cookie из HTTP- запросов и возвращает их в HTTP-ответах.CookieJarсущности автоматически истекает содержавшее cookies при необходимости. Подклассы также отвечают за хранение и извлечение файлов cookie из файла или базы данных.
policy является объектом, реализующим интерфейс
CookiePolicy. Другие аргументы см. в документации для соответствующего атрибуты.CookieJar, который может загрузить cookies от и возможно сохранить cookies к, файл на диске. Кукки - НЕ загруженный из названного файла, пока илиload()или методrevert()не называют. Подклассы этого класса задокументированы в разделе FileCookieJar подклассы и сотрудничество с веб-браузерами.Изменено в версии 3.8: Параметр имени файла поддерживает путеподобный объект.
Этот класс отвечает за определение того, следует ли принимать каждый файл cookie с/ возвращенный на сервер.
Аргументы конструктора должны передаваться только как аргументы ключевой. blocked_domains - последовательность доменных имен, к которым мы никогда не принимаем куки от, ни cookies возвращает . allowed_domains, если не
None, это - последовательность единственных областей, для которых мы принимаем и cookies возвращает . secure_protocols представляет собой последовательность протоколов, в которые можно добавлять безопасные файлы cookie. По умолчанию https и wss (безопасный websocket) считаются защищенными протоколами. Все остальные аргументы см. в документации для объектовCookiePolicyиDefaultCookiePolicy.DefaultCookiePolicyреализует стандартные правила принятия/отклонения для файлов cookie Netscape и RFC 2965. По умолчанию, cookies RFC 2109 (т.е. файлы cookie, полученные в заголовке Set-Cookie с версией cookie-атрибут 1), обрабатываются согласно правилам RFC 2965. Однако, если обработка RFC 2965 выключена, илиrfc2109_as_netscape-True, RFC, 2 109 куки „понижено“CookieJarсущность до куки Netscape, установивversionатрибутCookieсущность к 0.DefaultCookiePolicyтакже содержит некоторые параметры, позволяющие осуществлять определенную настройку политики.
Этот класс представляет файлы cookie Netscape, RFC 2109 и RFC 2965. Не ожидается, что пользователи
http.cookiejarстроят свои собственныеCookieсущности. Вместо этого, при необходимости, вызовитеmake_cookies()наCookieJarсущность.
См.также
Модуль urllib.request открытие URL-адреса с автоматической обработкой cookie-файлов.
Модуль http.cookies классы cookie HTTP, в основном полезные для серверных
код. Модули http.cookiejar и http.cookies не зависят друг от друга.
https://curl.haxx.se/rfc/cookie_spec.html спецификация исходного протокола
Netscape cookie. Хотя это все еще доминирующий протокол, протокол «Netscape
cookie», реализованный всеми основными браузерами (и http.cookiejar), имеет только
проходящее сходство с тем, что нарисован в cookie_spec.html.
RFC 2109 - механизм управления состоянием HTTP устарел RFC 2965. Использует Set-Cookie с версией = 1.
RFC 2965 - механизм управления состоянием HTTP протокол Netscape с исправленными ошибками. Использует Set-Cookie2 вместо Set-Cookie. Не широко используемый.
http://kristol.org/cookie/errata.html неоконченные ошибки RFC 2965.
RFC 2964 - использование управления состоянием HTTP
Объекты CookieJar и FileCookieJar¶
Объекты CookieJar поддерживают протокол итератора для итерации над
содержащимися объектами Cookie.
CookieJar имеет следующие методы:
Добавьте правильный заголовок Cookie в request.
Если позволяет политика (т.е.
rfc2965иhide_cookie2атрибутыCookieJarCookiePolicyсущность соответственно являются верными и ложными), заголовок Cookie2 также добавляется, когда это уместно.Объект 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.Изменено в версии 3.3: request объект нуждается в
origin_req_hostатрибут. Удалена зависимость от устаревшего методаget_origin_req_host().
Извлеченные кукки из HTTP response и хранит их в
CookieJar, где позволено политикой.CookieJarбудет искать допустимые заголовки Set-Cookie и Set-Cookie2 в аргументе response и хранить файлы cookie при необходимости (при условии утверждения методаCookiePolicy.set_ok()).Объект response (обычно результат вызова метода
urllib.request.urlopen()или подобного) должен поддерживать методinfo(), возвращающий методemail.message.Messageсущность.Объект request (обычно
urllib.request.Requestсущность) должен поддержать методыget_full_url(),get_host(),unverifiable()иorigin_req_hostатрибут, как зарегистрированоurllib.request. Запрос - используемый, чтобы установить дефолт значения для куки-атрибуты, а также для проверки, что куки разрешены, чтобы быть установленными.Изменено в версии 3.3: request объект нуждается в
origin_req_hostатрибут. Удалена зависимость от устаревшего методаget_origin_req_host().
Задайть
CookiePolicyсущность для использования.
Возвращает последовательность объектов
Cookie, извлеченных из объекта response.См. документацию для
extract_cookies()для интерфейсов, требуемых response и аргументов request.
Установить
Cookieесли политика говорит, что OK.
Установить
Cookie, без проверки политики на предмет необходимости ее установки.
Очистить некоторые куки.
При вызове без аргументов очистите все файлы cookie. Если задан один аргумент, будут удалены только куки-файлы, принадлежащие этому domain. Если задано два аргумента, куки-файлы, принадлежащие указанному domain и URL-адресу path, удаляются. Если задано три аргумента, то куки-файл с указанными domain, path и name удаляется.
Вызывает
KeyError, если соответствующего файла cookie не существует.
Удалить все файлы cookie сеанса.
Браки все содержавшее cookies, у которого есть истинный
discardатрибут (обычно, потому что у них было или cookies-атрибут неmax-ageилиexpiresили явное cookies-атрибутdiscard). Для интерактивных браузеров конец сеанса обычно соответствует закрытию окна браузера.Обратите внимание, что метод
save()в любом случае не сохранит файлы cookie сеанса, если вы не спросите об ином, передав аргумент true ignore_discard.
FileCookieJar реализует следующие дополнительные методы:
Сохранение файлов cookie в файл.
Этот базовый класс поднимает
NotImplementedError. Подклассы могут оставить этот метод нереализованным.filename - имя файла для сохранения файлов cookie. Если параметр filename не указан, параметр
self.filenameимеет значение используемый (по умолчанию - значение значение, переданное конструктору, если таковое имеется); еслиself.filenameNone, тоValueErrorподнимается.ignore_discard: сохранить даже файлы cookie, которые будут отброшены. ignore_expires: сохранение даже файлов cookie, срок действия которых истек
Файл перезаписывается, если он уже существует, в результате чего удаляются все содержащиеся в нем файлы cookie. Сохраненные файлы cookie можно восстановить позже с помощью методов
load()илиrevert().
Загрузка файлов cookie из файла.
Старые файлы cookie хранятся, если они не перезаписаны вновь загруженными.
Аргументы как для
save().Названный файл должен быть в формате, понятом под классом, или
LoadErrorбудет поднят. Кроме того,OSErrorможет быть поднят, например, если файл не существует.
Очистить все файлы cookie и перезагрузить файлы cookie из сохраненного файла.
revert()может создавать те же исключения, что иload(). Если будет неудача, то состояние объекта не будет изменен.
FileCookieJar сущности имеют следующие публичные атрибуты:
Имя файла по умолчанию, в котором хранятся файлы cookie. Эта атрибут может быть назначена.
Если значение равно true, лениво загружайте файлы cookie с диска. Это атрибут не должно быть назначено. Это только подсказка, так как это влияет только на производительность, а не поведение (если куки-файлы на диске не изменяются). Объект
CookieJarможет игнорировать его. None классовFileCookieJar, входящих в стандартную библиотеку, лениво загружает куки.
FileCookieJar подклассы и сотрудничество с веб-браузерами¶
Для чтения и письма предусмотрены следующие CookieJar подклассы.
FileCookieJar, который может загрузить от и сохранить cookies на диск в формате файла Mozillacookies.txt(который является также используемый браузерами рыси и Netscape).Примечание
При этом теряется информация о RFC 2965 cookies, а также о более новых или нестандартных cookie-атрибуты, таких как
port.Предупреждение
Резервное копирование файлов cookie перед сохранением, если у вас есть файлы cookie, потеря/повреждение которых было бы неудобно (есть некоторые тонкости, которые могут привести к незначительным изменениям в файле по мере загрузки/сохранения в оба конца).
Также обратите внимание, что файлы cookie, сохраненные во время работы Mozilla, будут забиты Mozilla.
FileCookieJar, который может загрузить от и сохранить cookies на диск в формате, совместимом с форматом файла libwww-perl библиотекиSet-Cookie3. Это удобно, если вы хотите хранить куки в читаемом человеком файле.Изменено в версии 3.8: Параметр имени файла поддерживает путеподобный объект.
Объекты CookiePolicy¶
Объекты, реализующие интерфейс CookiePolicy, имеют следующие методы:
Возвращает логическое значение значение, указывающее, следует ли принимать файлы cookie с сервера.
cookie является
Cookieсущность. request - это объект, реализующий интерфейс, определенный документацией дляCookieJar.extract_cookies().
Булев значение возвращает , указывающий, должно ли cookies быть возвращенный к серверу.
cookie является
Cookieсущность. request - это объект, реализующий интерфейс, определенный документацией дляCookieJar.add_cookie_header().
Возвращает
Falseесли файлы cookie не должны быть возвращенный, данный домен cookie.Этот метод является оптимизацией. Это устраняет необходимость проверки каждого файла cookie с определенным доменом (что может включать чтение многих файлов). Возвращение true из
domain_return_ok()иpath_return_ok()оставляет всю работуreturn_ok().Если параметр
domain_return_ok()возвращает значение true для домена cookie, вызывается методpath_return_ok()для пути cookie. В противном случаеpath_return_ok()иreturn_ok()никогда не вызываются для этого домена cookie. Еслиpath_return_ok()возвращает значение true,return_ok()вызывается с самим объектомCookieдля полной проверки. В противном случаеreturn_ok()никогда не вызывается для этого пути cookie.Обратите внимание, что
domain_return_ok()вызывается для каждого домена cookie, а не только для домена request. Например, функция может быть вызвана как с".example.com", так и с"www.example.com", если домен запроса является"www.example.com". То же самое касается иpath_return_ok().Аргумент request является документированным для
return_ok().
Возвращает
Falseесли файлы cookie не должны быть возвращенный, укажите путь cookie.См. документацию для
domain_return_ok().
В дополнение к реализации методов, описанных выше, реализации интерфейса
CookiePolicy должны также предоставлять следующие атрибуты, указывающие, какие
протоколы должны быть используемый, и каким образом. Все эти атрибуты могут
быть назначены в.
Осуществите протокол Netscape.
Осуществите протокол RFC 2965.
Не добавляйте заголовок Cookie2 к запросам (присутствие этого заголовка указывает к серверу, что мы понимаем cookies RFC 2965).
Наиболее полезным способом определения класса CookiePolicy является подкласс из
DefaultCookiePolicy и переопределение некоторых или всех методов, описанных выше. Сам
CookiePolicy может быть используемый как „пустой политикой“, чтобы позволить
устанавливать и принимать любого и все cookies (это вряд ли будет полезно).
Объекты DefaultCookiePolicy¶
Реализует стандартные правила приема и возврата файлов cookie.
Куки-файлы как 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, этот
класс позволяет блокировать и разрешать доменам установку и получение файлов
cookie. Есть также некоторые переключатели жесткости, которые позволяют немного
ужесточить довольно свободные правила протокола Netscape (ценой блокировки
некоторых доброкачественных файлов cookie).
Предоставляется черный список домена и белый список (по умолчанию оба
отключены). В настройке и возврате файлов cookie участвуют только домены, не
включенные в черный список и присутствующие в белом списке (если белый список
активен). Используйте аргумент конструктора 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 реализует следующие дополнительные методы:
Возвращает последовательность заблокированных доменов (в виде кортежа).
Задайте последовательность заблокированных доменов.
Возвращает находится ли domain в черном списке для установки или получения файлов cookie.
Возвращает
None, или последовательность разрешенных доменов (в виде кортежа).
Задайте последовательность разрешенных доменов или
None.
Возвращает отсутствует ли domain в белом списке для установки или получения файлов cookie.
DefaultCookiePolicy сущности имеют следующие атрибуты, которые все
инициализируются из аргументов конструктора с тем же именем и которым могут быть
присвоены.
Если это правда, запрос, что снижение
CookieJarсущность cookies RFC 2109 (т.е. cookies, полученное в заголовке Set-Cookie с cookies-атрибут вариантов 1) к печенью Netscape, устанавливая версию атрибутCookieсущность к 0. Дефолт значение -None, в этом случае RFC 2 109 куки, понижен, если и только если обработка RFC 2965 выключена. Поэтому RFC 2 109 куки понижены по умолчанию.
Общая строгость switches:
Не позволяйте сайтам устанавливать двухкомпонентные области со страной-код области верхнего уровня как
.co.uk,.gov.uk,.co.nz.etc. Это далеко не идеально и не гарантированно работать!
RFC 2965 переключатели строгости протокола:
Следуйте правилам RFC 2965 для непроверяемых транзакций (обычно непроверяемой транзакцией является транзакция, являющаяся результатом перенаправления или запроса изображения, размещенного на другом сайте). Если это ложно, файлы cookie never блокируются на основании возможности проверки
Коммутаторы строгости протокола Netscape:
Применять правила RFC 2965 к непроверяемым транзакциям даже для файлов cookie Netscape.
Флаги, указывающие, насколько строгими должны быть правила соответствия доменов для файлов cookie Netscape. Для получения информации о приемлемых значения см. ниже.
Игнорировать куки в Set-Cookie: заголовки, имена которых начинаются с
'$'.
Не разрешать установку файлов cookie, путь которых не соответствует URI запроса пути.
strict_ns_domain представляет собой коллекцию флагов. Его значение строится или-
ing вместе (например, DomainStrictNoDots|DomainStrictNonDomain означает, что установлены оба флага).
При настройке файлов cookie префикс хоста не должен содержать точку (например,
www.foo.bar.comне может задать файл cookie для.bar.com, посколькуwww.fooсодержит точку).
cookies, которое явно не определило cookies-атрибут
domain, может только быть возвращенный к области, равной области, которые устанавливают cookies (например.spam.example.comне будет возвращенный cookie изexample.com, у которого не былоdomaincookie-атрибут).
Устанавливая cookies, потребуйте полного матча области RFC 2965.
Для удобства предусмотрены следующие атрибуты, которые являются наиболее полезными сочетаниями вышеперечисленных флагов:
Эквивалентно 0 (т. е. все вышеперечисленные флаги строгости домена Netscape отключены).
Эквивалентный
DomainStrictNoDots|DomainStrictNonDomain.
Объекты куки¶
Cookie сущности имеют Python атрибуты примерно соответствующий
стандарту cookie-атрибуты, указанному в различных стандартах cookie.
Корреспонденция не непосредственная, потому что там сложные правила для
назначения дефолта значения, потому что max-age и cookies-атрибуты
expires содержат эквивалентную информацию, и потому что cookies RFC 2109
может быть „понижено“ http.cookiejar от версии 1 до версии 0 (Netscape) cookies.
Присвоение этих атрибуты не должно быть необходимым, кроме как в редких
случаях в методе CookiePolicy. Класс не обеспечивает внутреннюю согласованность,
поэтому вы должны знать, что вы делаете, если вы делаете это.
Целое число или
None. Файлы cookie Netscape имеютversion0. RFC 2965 и RFC 2109 cookies имеютversioncookie-атрибут 1. Тем не менее, обратите внимание, чтоhttp.cookiejarможет «понизить» файлы cookie RFC 2109 до файлов cookie Netscape, в этом случаеversionравен 0.
Имя файла cookie (строка).
cookies значение (строка), или
None.
Строка, представляющая порт или набор портов (например, „80“, или „80,8080“), или
None.
Путь cookie (a строка, например.
'/acme/rocket_launchers').
True, если cookies должно только быть возвращенный по безопасному соединению.
Целочисленная дата истечения срока действия в секундах с момента или
None. См. также методis_expired().
True, если это файл cookie сеанса.
Строковый комментарий с сервера, объясняющий функцию этого файла cookie или
None.
URL-адрес, связанный с комментарием с сервера, объясняющим функцию этого файла cookie или
None.
Trueесли этот cookie был получен как RFC 2109 cookie (т е. файл cookie поступил в заголовок Set-Cookie и значение версии cookie-attribute в этом заголовке был 1). Это атрибут предоставляется потому, чтоhttp.cookiejarможет «понизить» файлы cookie RFC 2109 до файлов cookie Netscape, в этом случаеversionравен 0.
Trueесли порт или набор портов был явно указан сервером (в заголовке Set-Cookie/ Set-Cookie2).
True, если домен был явно указан сервером.
Trueесли домен, явно указанный сервером, начинается с точки ('.').
Файлы cookie могут иметь дополнительные нестандартные cookie-атрибуты. Доступ к ним можно получить следующими способами:
Возвращает
Trueесли cookie имеет имя cookie-атрибут.
Если cookie имеет имя cookie-атрибут, возвращает его значение. В противном случае, возвращает default.
Задайте значение именованного cookie-атрибут.
Класс Cookie также определяет следующий метод:
True, прошел ли срок действия куки-файла по запросу сервера. Если задано значение now (в секундах после эпохи), возвращает , истек ли срок действия файла cookie в указанное время.
Примеры¶
Первый пример показывает наиболее распространенное использование 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-адрес с помощью файлов cookie Netscape, Mozilla или Lynx (для размещения файла cookie используется соглашение 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. Включите cookies
RFC 2965, быть более строгими об областях, устанавливая и возвращая cookies
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/")
