2006年05月19日

在Woodlog中和djangocn.org的digest中使用了cookie。cookie我以前用得不多,在request_response的
文档中,在描述response的地方有set_cookie的说明,使用很简单。但是我只设置了两个参数,一个是name,一个是value。但这样的
效果是如何的呢?只要不关闭浏览器,设置的cookie就会生效。但一旦关闭了浏览器,cookie就失效了。为什么呢?在set_cookie函数中有
两个参数:max_age和expires。如何正确设置它们呢?

在python的文档中,在Cookie模块中有简单的使用说明。特别是有一个关于RFC2109的链接。因为对于expire和max_age不是很清楚,于是我看了看说明:

max_age
是用秒表示的cookie最长生存期,一旦超过时间则就失效了。如果为0表示立即失效。而expire是用字符串表示的失效期。那么这两个参数其实是一样
的,有什么区别呢? 在RFC2109上说明,expire是Netscape最早定义的用来代替max-age的。

于是我又查阅了django中session的处理的代码,其中可以看到:

expires = datetime.datetime.strftime(datetime.datetime.utcnow() +
    datetime.timedelta(seconds=settings.SESSION_COOKIE_AGE),
    "%a, %d-%b-%Y %H:%M:%S GMT")
response.set_cookie(settings.SESSION_COOKIE_NAME, session_key,
    max_age=settings.SESSION_COOKIE_AGE, expires=expires,
    domain=settings.SESSION_COOKIE_DOMAIN)


可以看到max_age和expires两个参数都定义了。max_age使用的settings.SESSION_COOKIE_AGE在
global_settins.py可以看到是 60 * 60 * 24 * 7 * 2
它表示两个星期的秒数。而expires也正是根据两个星期计算出来的。这样max_age和expires所描述的时间其实是一样的。

所以为了省事,我们也可以这样来处理。