详解Python中的Cookie模块使用


Posted in Python onJuly 06, 2015

最近在用GAE开发自己的博客程序。虽然GAE的API没有显式的提供操作Cookie的方法,但他现有的架构,使我们有足够的自由来操作Cookie。

Cookie 模块,顾名思义,就是用来操作Cookie的模块。Cookie这块小蛋糕,玩过Web的人都知道,它是Server与Client保持会话时用到的信息 切片。 Http协议本身是无状态的,也就是说,同一个客户端发送的两次请求,对于Web服务器来说,没有直接的关系。既然这样,有人会问,既然Http是无状态 的, 为什么有些网页,只有输入了用户名与密码通过验证之后才可以访问?那是因为:对于通过身份验证的用户,Server会偷偷的在发往Client的数据中添 加 Cookie,Cookie中一般保存一个标识该Client的唯一的ID,Client在接下来对服务器的请求中,会将该ID以Cookie的形式一并 发往Server,Server从回传回来的Cookie中提取ID并与相应的用户绑定起来,从而实现身份验证。说白了,Cookie就是一个在服务器与客户端之间相互传递的字符串(下图通过FireFox的FireBug插件查看访问google.com时的Cookie)。 越扯越远了,回到我们的主题:Python标准模块 — Cookie。

详解Python中的Cookie模块使用

(上图是Http请求头中的Cookie信息)

详解Python中的Cookie模块使用

(上图是Http响应中的Cookie信息)
Cooke模块中定义了4个直接操作Cookie的类:BaseCookie、SimpleCookie、SerialCookie、 SmartCookie。其中,BaseCookie是基类,定义了操作Cookie的公共部分,其他3个类都继承自BaseCookie,它们之间的区 别仅仅在于序列化数据的方式不同。下面简单讲解这些类的使用。

BaseCookie基类: BaseCookies的行为非常像dict,可以用键/值对的形式来操作它,但是kye必须是字符串,value是Morsel对象 (下面会讲到Morsel)。BaseCookies定义了编码/解码,输入/输出操作的公共规范:

BaseCookie.value_encode(val):对数据进行序列化/反序列化。这些方法都返回字符串,以便通过Http传输。

BaseCookie.output():返回字符串,该字符串可以作为Http响应头发往客户端。

BaseCookie.js_output():返回嵌入js脚本的字符串,浏览器通过执行该脚本,就可以得到cooke数据。

BaseCookie.load(newdata):解析字符串为Cookie数据。

SimpleCookie、SerialCookie、SmartCookie都继承自BaseCookie,具有一致的行为,它们各自对 BaseCookie的value_decode, value_encode进行了重写并实现自己的序列化/反序列化策略,其中:

  •     SimpleCookie内部使用str()来对数据进行序列化;
  •     SerialCookie则通过pickle模块来序列化反序列化数据;
  •     SmartCookie相对聪明点,对于非字符串数据,使用pickle序列/反序列化,否则将字符串原样返回。

下面的例子简单的说明如何使用Cookie模块:
 

import Cookie
 
c = Cookie.SimpleCookie()
c['name'] = 'DarkBull'
c['address'] = 'ChinaHangZhou'
c['address']['path'] = '/' 
# 路径
c['address']['domain'] = 'appspot.com' 
# domain
c['address']['expires'] = 'Fir, 01-Oct-2010 20:00:00 GMT'  
# 过期时间
print c.output()
print c.js_output()
 
# 输出结果,与上图对照
# Set-Cookie: address=ChinaHangZhou; Domain=appspot.com; expires=Fir, 01-Oct-2010 20:00:00 GMT; Path=/
# Set-Cookie: name=DarkBull
 
# 作为脚本输出
# <script type="text/javascript">
# document.cookie = "address=ChinaHangZhou; Domain=appspot.com; expires=Fir, 01-Oct-2010 20:00:00 GMT; Path=/";
# </script>
 
# <script type="text/javascript">
# document.cookie = "name=DarkBull";
# </script>

Morsel类 : 用于表示Cookie中每一项数据的属性而抽象的类。这些属性包括:expires, path, comment, domain, max-age, secure, version等等(看上图下划线标注部分)。如果你玩过web,对这些应该不会陌生,可以在RCF2109中找到他们的具体定义

Morsel.key,Morsel.value:Cookie数据项的key/value(value可以是二进制数据);

Morsel.coded_value:数据编码后得到的字符串。Http协议是基于文本的协议,Server无法直接向Client发送二进制数据,只有序列化成字符串后,才能发往Client;

Morsel.set(key, value, coded_value):设置Cookie数据项的key、value、coded_value;

Morsel.isReversvedKey(key):如果key是expires, path, comment, domain, max-age, secure, version, httponly中的一个,返回True,否则返回False;

Morsel.output():返回型如“Set-Cookie: …”的字符串,表示一个Cookie数据项;

Morsel.js_output():返回Cookie数据项的脚本字符串;

Morsel.OutputString(): 返回Morsel的字符串表示;

Morsel使用示例:
 

import Cookie
 
m = Cookie.Morsel()
m.set('name', 'DarkBull', 'DarkBull')
m['expires'] = 'Fir, 01-Oct-2010 20:00:00 GMT'
m['domain'] = 'appspot.com'
print m.output()
 
# 结果
# Set-Cookie: name=DarkBull; Domain=appspot.com; expires=Fir, 01-Oct-2010 20:00:00
Python 相关文章推荐
Python实现的Excel文件读写类
Jul 30 Python
Python计时相关操作详解【time,datetime】
May 26 Python
Caffe均值文件mean.binaryproto转mean.npy的方法
Jul 09 Python
基于tensorflow加载部分层的方法
Jul 26 Python
python中的不可变数据类型与可变数据类型详解
Sep 16 Python
python 标准差计算的实现(std)
Jul 29 Python
python队列原理及实现方法示例
Nov 27 Python
基于python读取.mat文件并取出信息
Dec 16 Python
详解django中Template语言
Feb 22 Python
Python内置函数locals和globals对比
Apr 28 Python
python输入一个水仙花数(三位数) 输出百位十位个位实例
May 03 Python
python 获取字典特定值对应的键的实现
Sep 29 Python
python计算文本文件行数的方法
Jul 06 #Python
python实现ping的方法
Jul 06 #Python
python删除指定类型(或非指定)的文件实例详解
Jul 06 #Python
python根据日期返回星期几的方法
Jul 06 #Python
python获取文件扩展名的方法
Jul 06 #Python
python创建临时文件夹的方法
Jul 06 #Python
Python中几个比较常见的名词解释
Jul 04 #Python
You might like
用PHP实现的四则运算表达式计算实现代码
2011/08/02 PHP
php判断页面是否是微信打开的示例(微信打开网页)
2014/04/25 PHP
用js实现计算代码行数的简单方法附代码
2007/08/13 Javascript
MC Dialog js弹出层 完美兼容多浏览器(5.6更新)
2010/05/06 Javascript
精通Javascript系列之数据类型 字符串
2011/06/08 Javascript
表单类各种类型(文本框)失去焦点效果jquery代码
2013/04/26 Javascript
js判断当前浏览器类型,判断IE浏览器方法
2014/06/02 Javascript
浅谈javascript 函数属性和方法
2015/01/21 Javascript
NodeJS学习笔记之Connect中间件模块(二)
2015/01/27 NodeJs
Javascript简写条件语句(推荐)
2016/06/12 Javascript
jQuery动态创建元素以及追加节点的实现方法
2016/10/20 Javascript
Vue.extend构造器的详解
2017/07/17 Javascript
使用Vue自定义数字键盘组件(体验度极好)
2017/12/19 Javascript
vue同步父子组件和异步父子组件的生命周期顺序问题
2018/10/07 Javascript
深入理解 Koa 框架中间件原理
2018/10/18 Javascript
微信小程序 自定义复选框实现代码实例
2019/09/04 Javascript
[01:05:40]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS DT第三场
2014/05/24 DOTA
python3使用urllib模块制作网络爬虫
2016/04/08 Python
Python设置默认编码为utf8的方法
2016/07/01 Python
Python简单实现安全开关文件的两种方式
2016/09/19 Python
python中类变量与成员变量的使用注意点总结
2017/04/29 Python
python 请求服务器的实现代码(http请求和https请求)
2018/05/25 Python
基于python实现高速视频传输程序
2019/05/05 Python
python Django里CSRF 对应策略详解
2019/08/05 Python
python每5分钟从kafka中提取数据的例子
2019/12/23 Python
python GUI库图形界面开发之PyQt5日期时间控件QDateTimeEdit详细使用方法与实例
2020/02/27 Python
python连接mysql有哪些方法
2020/06/24 Python
详解Canvas 跨域脱坑实践
2018/11/07 HTML / CSS
Gucci法国官方网站:意大利奢侈品牌
2018/07/25 全球购物
KENZO官网:高田贤三在法国创立的品牌
2019/05/16 全球购物
毕业生求职简历的自我评价
2013/10/23 职场文书
2015教师年度考核评语
2015/03/25 职场文书
2016入党积极分子党校培训心得体会
2016/01/06 职场文书
vue封装数字翻牌器
2022/04/20 Vue.js
MySQL中的全表扫描和索引树扫描
2022/05/15 MySQL
详解Go语言中Get/Post请求测试
2022/06/01 Golang