Веб-броузеры, такие как Firefox и Internet Explorer, в целом обеспечивают корректную работу с этим протоколом на стороне клиента, сохраняя и отправляя данные в cookies. В этой главе нас в основном интересует обработка cookies на стороне сервера. Cookies создаются в результате передачи специальных заголовков HTTP в начале потока ответа:
Content-type: text/html Set-Cookie: foo=bar;
<HTML>…
Полный формат заголовка «Set-Cookie» имеет следующий вид:
Set-Cookie: name=value; expires=date; path=pathname; domain=domainname; secure
По умолчанию в параметре domain передается сетевое имя сервера, отправившего cookies, а в параметре path — путь к документу или сценарию, который устанавливает cookies. Эти параметры позднее используются клиентом, чтобы определить, когда отправлять cookies обратно на сервер. Создание cookies на языке Python реализуется очень просто — следующие инструкции в сценарии CGI сохраняют cookies с временем последнего посещения сайта:
import http.cookies, time
cook = http.cookies.SimpleCookie()
cook[‘visited’] = str(time.time()) # словарь
print(cook.output()) # выведет "Set-Cookie: visited=1276623053.89"
print(‘Content-type: text/html\n’)
Вызов функции SimpleCookie здесь создает объект, напоминающий словарь, ключами которого являются строки (имена cookies), а значениями — объекты Morsel (описывающие значения cookies). Объекты Morsel в свою очередь также являются объектами, похожими на словари, содержащими по одному ключу для каждого свойства cookies: path и domain; expires, определяющее дату истечения срока хранения cookies (по умолчанию cookies считаются действительными только на протяжении сеанса работы броузера); и так далее. Кроме того, объекты Morsel имеют дополнительные атрибуты — например, key и value, определяющие имя и значение cookies соответственно. Операция присваивания ключу объекта cookies автоматически создает объект Morsel из строки, а метод output объектов cookies возвращает строку, которую можно использовать в качестве заголовка HTTP; тот же эффект дает непосредственная попытка вывода объекта с помощью функции print благодаря переопределению метода __str__ перегрузки оператора. Ниже приводится более полный пример использования этого интерфейса:
> >> import http.cookies, time
> >> cooks = http.cookies.SimpleCookie()
> >> cooks[‘visited’] = time.asctime()
> >> cooks[‘username’] = ‘Bob’
> >> cooks[‘username’][‘path’] = ‘/myscript’
>>> cooks[‘visited’].value ‘Tue Jun 15 13:35:20 2010’ >>> print(cooks[‘visited’]) Set-Cookie: visited="Tue Jun 15 13:35:20 2010" >>> print(cooks)
Set-Cookie: username=Bob; Path=/myscript
Set-Cookie: visited="Tue Jun 15 13:35:20 2010"
Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, II том, 2011