Python中的Cookie模块如何使用


Posted in Python onJune 04, 2020

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)。

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

知识点扩展:

为什么要使用Cookie呢?

Cookie,指某些网站为了辨别用户身份、进行session跟踪而储存在用户本地终端上的数据(通常经过加密)

比如说有些网站需要登录后才能访问某个页面,在登录之前,你想抓取某个页面内容是不允许的。那么我们可以利用Urllib2库保存我们登录的Cookie,然后再抓取其他页面就达到目的了。

以上就是Python中的Cookie模块如何使用的详细内容,更多关于Python中的Cookie模块用法的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python计数排序和基数排序算法实例
Apr 25 Python
python3.6 +tkinter GUI编程 实现界面化的文本处理工具(推荐)
Dec 20 Python
Django框架多表查询实例分析
Jul 04 Python
python3使用matplotlib绘制条形图
Mar 25 Python
pyftplib中文乱码问题解决方案
Jan 11 Python
浅谈python中频繁的print到底能浪费多长时间
Feb 21 Python
小 200 行 Python 代码制作一个换脸程序
May 12 Python
python 实现PIL模块在图片画线写字
May 16 Python
Jupyter Notebook添加代码自动补全功能的实现
Jan 07 Python
python中if嵌套命令实例讲解
Feb 25 Python
python SOCKET编程基础入门
Feb 27 Python
Python 详解通过Scrapy框架实现爬取百度新冠疫情数据流程
Nov 11 Python
Python爬虫获取页面所有URL链接过程详解
Jun 04 #Python
Python中的全局变量如何理解
Jun 04 #Python
使用OpenCV获取图片连通域数量,并用不同颜色标记函
Jun 04 #Python
Python urllib2运行过程原理解析
Jun 04 #Python
Python如何生成xml文件
Jun 04 #Python
基于python代码批量处理图片resize
Jun 04 #Python
Python脚本如何在bilibili中查找弹幕发送者
Jun 04 #Python
You might like
PHP 防恶意刷新实现代码
2010/05/16 PHP
javascript 对象比较实现代码
2009/04/27 Javascript
用Javascript 获取页面元素的位置的代码
2009/09/25 Javascript
有效的捕获JavaScript焦点的方法小结
2009/10/08 Javascript
JQuery的Alert消息框插件使用介绍
2010/10/09 Javascript
JavaScript高级程序设计(第3版)学习笔记10 再访js对象
2012/10/11 Javascript
JQueryiframe页面操作父页面中的元素与方法(实例讲解)
2013/11/19 Javascript
用队列模拟jquery的动画算法实例
2015/01/20 Javascript
javascript中关于类型判断的一些疑惑小结
2018/10/14 Javascript
sortable+element 实现表格行拖拽的方法示例
2019/06/07 Javascript
解决layui的form里的元素进行动态生成,验证失效的问题
2019/09/14 Javascript
JS使用正则表达式判断输入框失去焦点事件
2019/10/16 Javascript
Vue 的 v-model用法实例
2020/11/23 Vue.js
[57:59]完美世界DOTA2联赛循环赛 Ink Ice vs LBZS BO2第一场 11.05
2020/11/05 DOTA
Python3通过Luhn算法快速验证信用卡卡号的方法
2015/05/14 Python
使用python画个小猪佩奇的示例代码
2018/06/06 Python
详解PANDAS 数据合并与重塑(join/merge篇)
2019/07/09 Python
python同步两个文件夹下的内容
2019/08/29 Python
通过python3实现投票功能代码实例
2019/09/26 Python
python常用排序算法的实现代码
2019/11/08 Python
keras .h5转移动端的.tflite文件实现方式
2020/05/25 Python
解决pytorch多GPU训练保存的模型,在单GPU环境下加载出错问题
2020/06/23 Python
科颜氏加拿大官方网站: Kiehl’s加拿大
2016/08/16 全球购物
美国时尚在线:Showpo
2017/09/08 全球购物
Sneaker Studio乌克兰:购买运动鞋
2018/03/26 全球购物
地球鞋加拿大官网:Earth Shoes Canada
2020/11/17 全球购物
Prototype是怎么扩展DOM的
2014/10/01 面试题
电台实习生求职信
2014/02/25 职场文书
运动会宣传口号
2014/06/09 职场文书
党员四风问题对照检查材料思想汇报
2014/09/16 职场文书
无财产离婚协议书范本
2014/10/28 职场文书
个人学习群众路线心得体会
2014/11/05 职场文书
2015年药店店长工作总结
2015/04/29 职场文书
2015年污水处理厂工作总结
2015/05/26 职场文书
Python函数式编程中itertools模块详解
2021/09/15 Python
Nginx静态压缩和代码压缩提高访问速度详解
2022/05/30 Servers