Python HTTP客户端自定义Cookie实现实例


Posted in Python onApril 28, 2017

Python HTTP客户端自定义Cookie实现实例

几乎所有脚本语言都提供了方便的 HTTP 客户端处理的功能,Python 也不例外,使用 urllib 和 urllib2 可以很方便地进行 HTTP GET 和 POST 等各种操作。并且还允许以类似于插件的形式加入一些 handler ,来定制 request 和 response ,比如代理的支持和 cookie 的支持都是这样添加进来的。具体来说,通过如下方式构造一个 opener :

opener = urllib2.build_opener(urllib2.HTTPCookieProcessor())

然后这个 opener 就可以处理 cookie 了,相当方便,并且可定制性也……好吧,总之,现在我希望能在客户端手动插入一些 cookie 值,但是不管是 HTTPCookieProcessor 还是 cookielib 里的 CookieJar 都没有提供类似的方法可以来实现。

看起来,也并不是我一个人有这样的需求,因为我在查找解决方案的时候,还找到了有人给 Python 提交的这个 Patch,就是添加这个功能。不过看起来好像还没有被 accept 的样子,这样对标准库做暴力 patch 的方式可移植性似乎也不好。所以我还是另外找了解决方案,其实也很简单:看了 HTTPCookieProcessor 的实现代码之后,发现我可以做类似的事情,也就是在写一个 handler ,把我想要的 cookie 值强制放到 request 对象的 header 中去。

于是我查了 Python 的文档,对于 handler 的接口好像几乎没有描述,于是我就照着 HTTPCookieProcessor 来写了。这个 handler 应该放在正常的 cookie 处理 handler 的后面,然后检查已经存在的 cookie header ,再进行合并一下。不过比较诡异的是在 Python 的文档里并没有找到 Request 对象有 get_header 之类的方法可以得到已经存在的 header 项的值,觉得很诡异,于是直接查了源代码,才找到了,确实有这个方法。之前有听人说过 Ruby 的文档做得如何如何的烂,Python 的文档做得如何如何的好,我虽然没觉得 Ruby 的文档很烂,但是也觉得 Python 的文档确实不错,我最喜欢它末尾的 Examples 。两个文档系统倒是走的不同的路,Ruby 的文档是从代码中抽取(特定格式的)注释来自动生成的,类似于 javadoc ;而 Python 现在用的是独立于源代码的文档系统,人工写的,不过到头来居然连函数都漏掉了,可见人工维护文档的弊端还是很明显的。其实我见过的文档系统,最好用的应该还是属于 Emacs/Elisp 了吧。 不过,废话少讲,handler 如下:

class SimpleCookieHandler(urllib2.BaseHandler):
 def http_request(self, req):
  simple_cookie = 'cc98Simple=1'
  if not req.has_header('Cookie'):
   req.add_unredirected_header('Cookie', simple_cookie)
  else:
   cookie = req.get_header('Cookie')
   req.add_unredirected_header('Cookie', simple_cookie + '; ' + cookie)
  return req

然后,构造 opener 的时候加上这个 handler 就可以了:

opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(), 
SimpleCookieHandler())

但总归是一个 workaround ,期待那个 patch 被加入到标准库中吧。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

Python 相关文章推荐
python遍历数组的方法小结
Apr 30 Python
详细讲解Python中的文件I/O操作
May 24 Python
Python下的常用下载安装工具pip的安装方法
Nov 13 Python
python中urlparse模块介绍与使用示例
Nov 19 Python
python+opencv轮廓检测代码解析
Jan 05 Python
Python 通配符删除文件的实例
Apr 24 Python
Python列表生成式与生成器操作示例
Aug 01 Python
CentOS6.9 Python环境配置(python2.7、pip、virtualenv)
May 06 Python
Python中遍历列表的方法总结
Jun 27 Python
python创建ArcGIS shape文件的实现
Dec 06 Python
解决python绘图使用subplots出现标题重叠的问题
Apr 30 Python
详解Python函数print用法
Jun 18 Python
Python 通过pip安装Django详细介绍
Apr 28 #Python
python 使用get_argument获取url query参数
Apr 28 #Python
Python、PyCharm安装及使用方法(Mac版)详解
Apr 28 #Python
详谈Python2.6和Python3.0中对除法操作的异同
Apr 28 #Python
浅谈Python2.6和Python3.0中八进制数字表示的区别
Apr 28 #Python
用pickle存储Python的原生对象方法
Apr 28 #Python
Python标准库之collections包的使用教程
Apr 27 #Python
You might like
解析关于wamp启动是80端口被占用的问题
2013/06/21 PHP
php查询ip所在地的方法
2014/12/05 PHP
php依赖注入知识点详解
2019/09/23 PHP
JavaScript入门教程(6) Window窗口对象
2009/01/31 Javascript
JavaScript的document对象和window对象详解
2010/12/30 Javascript
IE6/7/8中Option元素未设value时Select将获取空字符串
2011/04/07 Javascript
兼容最新firefox、chrome和IE的javascript图片预览实现代码
2014/08/08 Javascript
javascript设计模式之中介者模式Mediator
2014/12/30 Javascript
深入探讨JavaScript String对象
2015/03/09 Javascript
浅析创建javascript对象的方法
2016/05/13 Javascript
JavaScript使用readAsDataUrl方法预览图片
2017/05/10 Javascript
Vue表单类的父子组件数据传递示例
2018/05/03 Javascript
angularjs实现的购物金额计算工具示例
2018/05/08 Javascript
js实现导航跟随效果
2018/11/17 Javascript
超好用的jQuery分页插件jpaginate用法示例【附源码下载】
2018/12/06 jQuery
vue element-ui读取pdf文件的方法
2019/11/26 Javascript
Python输出PowerPoint(ppt)文件中全部文字信息的方法
2015/04/28 Python
Python探索之实现一个简单的HTTP服务器
2017/10/28 Python
Python使用matplotlib绘制余弦的散点图示例
2018/03/14 Python
PyTorch读取Cifar数据集并显示图片的实例讲解
2018/07/27 Python
Centos下实现安装Python3.6和Python2共存
2018/08/15 Python
详解python中sort排序使用
2019/03/23 Python
python制作简单五子棋游戏
2019/06/18 Python
python networkx 包绘制复杂网络关系图的实现
2019/07/10 Python
tensorflow实现打印ckpt模型保存下的变量名称及变量值
2020/01/04 Python
Python2和Python3中@abstractmethod使用方法
2020/02/04 Python
英国家电直销:Appliances Direct
2016/09/22 全球购物
DJI大疆德国官方商城:大疆无人机
2018/09/01 全球购物
高中数学教学反思
2014/01/30 职场文书
八一建军节演讲稿
2014/09/10 职场文书
普通党员四风问题对照检查材料
2014/09/27 职场文书
孝女彩金观后感
2015/06/10 职场文书
公司欠款证明
2015/06/24 职场文书
幼儿园教师教学反思
2016/03/02 职场文书
Python requests库参数提交的注意事项总结
2021/03/29 Python
python数字图像处理:图像的绘制
2022/06/28 Python