跳转到内容

Karrigell/设置、读取和删除 Cookie

来自维基教科书,开放的书籍,面向开放的世界

Cookie 由脚本中可用的两个变量管理

  • COOKIE 是一个类似字典的对象,它保存浏览器发送的并由脚本接收的 Cookie
  • SET_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 列表中

华夏公益教科书