Python Cookie模块详解:类结构与实战用法
本文深入解析Python标准库中的Cookie模块,详细阐述BaseCookie、SimpleCookie、SerialCookie及SmartCookie四大类的区别与序列化策略。通过代码示例展示如何利用Morsel类设置Cookie属性(如路径、域名、过期时间),并演示如何在HTTP响应中生成Cookie字符串及JavaScript脚本,帮助开发者理解无状态HTTP协议下的会话保持机制。
Python Cookie模块概述
Cookie模块是Python标准库中专门用于处理Cookie操作的组件。
对于Web开发者而言,Cookie是服务器与客户端之间维持会话状态的关键信息载体。由于HTTP协议本身是无状态的,即同一客户端发出的多次请求在服务器端被视为相互独立,这导致了一个常见疑问:为何部分网页要求用户输入用户名和密码验证后才能访问?
这背后的机制在于:当用户通过身份验证后,服务器会在发送给客户端的数据中嵌入Cookie,其中通常包含一个唯一标识该客户端的ID。在后续请求中,客户端会将此ID以Cookie形式回传至服务器,服务器据此提取ID并与对应用户绑定,从而实现身份验证。简言之,Cookie是服务器与客户端间传递的字符串数据(可通过FireFox的FireBug插件查看访问google.com时的Cookie详情)。
Cookie模块核心类解析
Cookie模块定义了四个直接操作Cookie的类:BaseCookie、SimpleCookie、SerialCookie和SmartCookie。其中,BaseCookie作为基类,定义了Cookie操作的公共部分;其他三个类均继承自BaseCookie,它们的主要区别仅在于数据序列化的方式不同。下文将简要介绍这些类的使用方法。
BaseCookie基类的行为类似于字典,允许通过键值对形式进行操作,但键必须是字符串,值则是Morsel对象(下文将介绍Morsel)。BaseCookie定义了编码/解码及输入/输出操作的公共规范:
- BaseCookie.value_encode(val):用于数据的序列化与反序列化。这些方法均返回字符串,以便通过HTTP协议进行传输。
- BaseCookie.output():返回一个字符串,该字符串可直接作为HTTP响应头发送给客户端。
- BaseCookie.js_output():返回嵌入JavaScript脚本的字符串,浏览器执行该脚本即可获取Cookie数据。
- 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类属性与方法详解
Morsel类:这是一个抽象类,用于表示Cookie中各项数据的属性,包括expires、path、comment、domain、max-age、secure、version等(见上图下划线标注部分)。熟悉Web开发的读者对这些属性应该不会陌生,具体定义可参考RFC2109。
Morsel.key、Morsel.value:分别表示Cookie数据项的键和值(value可以是二进制数据);
Morsel.coded_value:数据编码后生成的字符串。由于HTTP协议基于文本,服务器无法直接向客户端发送二进制数据,必须将其序列化为字符串后方可发送;
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
Cookie的应用场景与价值
知识点扩展:
为什么要使用Cookie?
Cookie是指某些网站为了辨别用户身份、进行Session跟踪而存储在用户本地终端上的数据(通常经过加密)。
例如,某些网站需要登录后才能访问特定页面。在登录前,直接抓取页面内容可能受限。此时,我们可以利用Urllib2库保存登录后的Cookie,随后在抓取其他页面时使用这些Cookie,从而达到目的。
以上就是Python中Cookie模块使用方法的详细内容,更多关于Python中Cookie模块用法的资料,请关注本站其他相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













