Как уже упоминалось выше, модуль urllib.request предоставляет интерфейс для чтения страниц ответа по заданному адресу URL и использует модуль http.cookiejar для поддержки сохранения cookies на стороне клиента и отправки их на сервер. Однако эта поддержка не обеспечивается по умолчанию. Например, ниже выполняется тестирование сценария установки cookies из предыдущего раздела — при повторном обращении к сценарию cookies не возвращаются обратно на сервер:
>>> from urllib.request import urlopen
>>> reply = urlopen(‘http://localhost/cgi-bin/cookies.py’).read()
>>> print(reply)
b'<p>His name shall be… Set-Cookie: user=Brian</p>\n’
>>> reply = urlopen(‘http://localhost/cgi-bin/cookies.py’).read()
>>> print(reply)
b'<p>His name shall be… Set-Cookie: user=Brian</p>\n’
Для корректной поддержки cookies с помощью этого модуля нам нужно просто включить в работу класс обработки cookies — то же относится и к другим необязательным расширениям, реализованным в этом модуле. Попробуем вновь обратиться к сценарию из предыдущего раздела:
> >> import urllib.request as urllib
> >> opener = urllib.build_opener(urllib.HTTPCookieProcessor())
> >> urllib.install_opener(opener)
>>>
>>> reply = urllib.urlopen(‘http://localhost/cgi-bin/cookies.py’).read()
>>> print(reply)
b'<p>His name shall be… Set-Cookie: user=Brian</p>\n’
>>> reply = urllib.urlopen(‘http://localhost/cgi-bin/cookies.py’).read()
>>> print(reply)
b'<p>Welcome back, Brian</p>\n’
>>> reply = urllib.urlopen(‘http://localhost/cgi-bin/cookies.py’).read()
>>> print(reply)
b'<p>Welcome back, Brian</p>\n’
Теперь все работает, потому что модуль urllib.request имитирует поведение веб-броузера в отношении cookies — он сохраняет cookies, когда эта операция запрашивается в заголовках страницы ответа, генерируемой сценарием, и добавляет их в заголовки при повторных обращениях к этому же сценарию. Кроме того, так же, как и броузер, этот модуль удалит cookies при завершении и повторном запуске интерактивного сеанса Python и повторном выполнении этого программного кода. Информацию об интерфейсах этого модуля смотрите в руководстве по стандартной библиотеке.
Несмотря на удобства в использовании, cookies имеют свои недостатки. Во-первых, они имеют ограниченный размер (типичные ограничения: 4 Кбайта на один блок данных cookies, не более 300 cookies всего и не более 20 cookies для каждого доменного имени). Во-вторых, в большинстве броузеров имеется возможность отключить cookies, что делает их непригодными для хранения критически важных данных. Некоторые даже рассматривают их, как вторжение в систему, потому что их можно использовать для слежения за действиями пользователя. (Многие сайты просто требуют, чтобы поддержка cookies была включена, устраняя тем самым эту проблему.) Наконец, поскольку cookies передаются между клиентом и сервером через сеть, они защищены в той же мере, в какой защищен сам поток данных — может быть далеко небезопасно передавать секретные данные, если для доступа к странице не используется защищенный протокол HTTP. Защищенные cookies и серверные концепции мы исследуем в следующей главе.
За дополнительной информацией о модулях, реализующих поддержку cookies, и о протоколах работы с cookies в целом обращайтесь к руководству по стандартной библиотеке Python и к ресурсам в Сети. Вполне возможно, что в будущем похожие механизмы хранения данных будут предоставлять реализации HTML.
Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, II том, 2011