Karrigell/设置、读取和删除 Cookie
外观
Cookie 由脚本中可用的两个变量管理
COOKIE
是一个类似字典的对象,它保存浏览器发送的并由脚本接收的 CookieSET_COOKIE
是一个类似字典的对象,由脚本用来设置 Cookie 值、路径、过期日期等,并将它们发送到浏览器
这是一个简单的脚本 cookies.py,它展示了如何设置、读取和删除 Cookie
def index(**kw):
body = 'Received cookies'
for cookie in COOKIE:
body += BR()+B(cookie)+' '+COOKIE[cookie].value
body += A('Erase',href="erase?name=%s" %cookie)
form = FORM(action ="set_cookie",method="post")
form <= 'Name'+INPUT(name="name")+BR()
form <= 'Value' + INPUT(name="value")+BR()
form <= INPUT(Type="submit",value="Ok")
return HTML(BODY(body+form))
def set_cookie(name,value):
SET_COOKIE[name] = value
SET_COOKIE[name]['path'] = '/'
raise HTTP_REDIRECTION('index')
def cookie_expiry_date(numdays):
""" Returns a cookie expiry date in the required format.
`expires` should be a string in the format "Wdy, DD-Mon-YY HH:MM:SS GMT"
"""
from datetime import date, timedelta
new = date.today() + timedelta(days = numdays)
return new.strftime("%a, %d-%b-%Y 23:59:59 GMT")
def erase(name):
SET_COOKIE[name] = ''
SET_COOKIE[name]['path'] = '/'
SET_COOKIE[name]['expires'] = cookie_expiry_date(-10)
SET_COOKIE[name]['max-age'] = 0
raise HTTP_REDIRECTION('index')
在 index()
中,会打印浏览器发送的 Cookie。然后,一个表单允许用户设置另一个 Cookie,并指定其名称和值
此表单提交到函数 set_cookie(name,value)
。在此函数中,会在 SET_COOKIE
中创建新条目,包含提交的数据。此条目的键“path”设置为服务器根目录。然后,会重定向到 index()
函数
完成此重定向后,新创建的 Cookie 会被发送到浏览器。浏览器会存储其值和属性;然后,它会向 URL http://host/cookies.py/index
发送请求
发送此请求时,请求头会包含此 Cookie,脚本会在 COOKIE
变量中接收到它:因此,Cookie 名称和值会在页面的顶部打印出来
要删除 Cookie,会提供一个链接,指向函数 erase(name)
,其中 name 是 Cookie 名称。函数 erase()
使用 SET_COOKIE
删除值,并将过期日期设置为过去(今天之前 10 天),使用 cookie_expiry_date()
函数将日期时间对象转换为 Cookie 规范支持的格式
最后,当这些值设置好后,会执行另一个重定向到 index()
:浏览器会收到关于指定 Cookie 的新信息。由于过期日期已到,它会删除它。当它向 http://host/cookies.py/index
发送请求时,它不会发送此 Cookie 的标头,因此它不会出现在收到的 Cookie 列表中