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集合用法实例分析
May 30 Python
Python 自动化表单提交实例代码
Jun 08 Python
JS设计模式之责任链模式实例详解
Feb 03 Python
使用python中的in ,not in来检查元素是不是在列表中的方法
Jul 06 Python
python实现感知机线性分类模型示例代码
Jun 02 Python
python删除列表元素的三种方法(remove,pop,del)
Jul 22 Python
Python re 模块findall() 函数返回值展现方式解析
Aug 09 Python
python装饰器的特性原理详解
Dec 25 Python
python 实现字符串下标的输出功能
Feb 13 Python
pytorch随机采样操作SubsetRandomSampler()
Jul 07 Python
Django mysqlclient安装和使用详解
Sep 17 Python
Python 类,对象,数据分类,函数参数传递详解
Sep 25 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
PHP获取文件绝对路径的代码(上一级目录)
2011/05/29 PHP
php中一个完整表单处理实现代码
2011/11/10 PHP
探讨Hessian在PHP中的使用分析
2013/06/13 PHP
解析php常用image图像函数集
2013/06/24 PHP
php颜色转换函数hex-rgb(将十六进制格式转成十进制格式)
2013/09/23 PHP
php中smarty区域循环的方法
2015/06/11 PHP
ThinkPHP中order()使用方法详解
2016/04/19 PHP
浅析PHP中的闭包和匿名函数
2017/12/25 PHP
JavaScrip单线程引擎工作原理分析
2010/09/04 Javascript
统计jQuery中各字符串出现次数的工具
2012/05/03 Javascript
js 操作select和option常用代码整理
2012/12/13 Javascript
AngularJS入门教程之学习环境搭建
2014/12/06 Javascript
nodejs中的fiber(纤程)库详解
2015/03/24 NodeJs
js采用concat和sort将N个数组拼接起来的方法
2016/01/21 Javascript
jQuery循环遍历子节点并获取值的方法
2016/04/14 Javascript
angularjs实现的前端分页控件示例
2017/02/10 Javascript
vue2.0 循环遍历加载不同图片的方法
2018/03/06 Javascript
Servlet3.0与纯javascript通过Ajax交互的实例详解
2018/03/18 Javascript
JS实现字符串去重及数组去重的方法示例
2018/04/21 Javascript
JavaScript指定断点操作实例教程
2018/09/18 Javascript
Vue+Element实现动态生成新表单并添加验证功能
2019/05/23 Javascript
vue中created和mounted的区别浅析
2019/08/13 Javascript
vue的三种图片引入方式代码实例
2019/11/19 Javascript
Angular封装表单控件及思想总结
2019/12/11 Javascript
[01:04:49]KG vs LGD 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
Python读取mat文件,并转为csv文件的实例
2018/07/04 Python
如何使用python传入不确定个数参数
2020/02/18 Python
pytorch 使用加载训练好的模型做inference
2020/02/20 Python
各大浏览器 CSS3 和 HTML5 兼容速查表 图文
2010/04/01 HTML / CSS
纯CSS3制作漂亮带动画效果的主机价格表
2015/04/25 HTML / CSS
类如何去实现接口
2013/12/19 面试题
美发店5.1活动方案
2014/01/24 职场文书
入党推优材料
2014/06/02 职场文书
平遥古城导游词
2015/02/03 职场文书
业务员岗位职责范本
2015/04/03 职场文书
SpringBoot Http远程调用的方法
2022/08/14 Java/Android