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
атрибутыCookieJar
CookiePolicy
сущность соответственно являются верными и ложными), заголовок 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.filename
None
, то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
, у которого не былоdomain
cookie-атрибут).
Устанавливая 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 имеютversion
0. RFC 2965 и RFC 2109 cookies имеютversion
cookie-атрибут 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/")