Python Cookie模块详解:类结构与实战用法

周末不加班
周末不加班
发布时间:2026-10-14| 5人浏览过
原创

本文深入解析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模块用法的资料,请关注本站其他相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。