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入门基础之用户输入与模块初认识
Nov 14 Python
浅谈Django学习migrate和makemigrations的差别
Jan 18 Python
Python读取图片为16进制表示简单代码
Jan 19 Python
在python带权重的列表中随机取值的方法
Jan 23 Python
python中import与from方法总结(推荐)
Mar 21 Python
python错误调试及单元文档测试过程解析
Dec 19 Python
关于TensorFlow新旧版本函数接口变化详解
Feb 10 Python
Python 序列化和反序列化库 MarshMallow 的用法实例代码
Feb 25 Python
python实现UDP协议下的文件传输
Mar 20 Python
解决Pytorch自定义层出现多Variable共享内存错误问题
Jun 28 Python
windows10在visual studio2019下配置使用openCV4.3.0
Jul 14 Python
python两种注释用法的示例
Oct 09 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文件的实现方法
2007/03/19 PHP
php简单静态页生成过程
2008/03/27 PHP
PHP输出时间差函数代码
2013/01/28 PHP
php生成年月日下载列表的方法
2015/04/24 PHP
PHP编程基本语法快速入门手册
2016/01/07 PHP
PHP PDOStatement::setAttribute讲解
2019/02/01 PHP
基于jquery的兼容各种浏览器的iframe自适应高度的脚本
2010/08/13 Javascript
javascript 常用功能总结
2012/03/18 Javascript
javascript克隆对象深度介绍
2012/11/20 Javascript
jquery事件与函数的使用介绍
2013/09/29 Javascript
jquery validation验证身份证号,护照,电话号码,email(实例代码)
2013/11/06 Javascript
js实现绿白相间竖向网页百叶窗动画切换效果
2015/03/02 Javascript
JavaScript通过function定义对象并给对象添加toString()方法实例分析
2015/03/23 Javascript
jQuery点击按钮弹出遮罩层且内容居中特效
2015/12/14 Javascript
JavaScript中数组去除重复的三种方法
2016/04/22 Javascript
vue返回上一页面时回到原先滚动的位置的方法
2018/12/20 Javascript
微信小程序拍照和摄像功能实现方法示例
2019/02/01 Javascript
JavaScript中AOP的实现与应用
2019/05/06 Javascript
解决vue+ element ui 表单验证有值但验证失败问题
2020/01/16 Javascript
node.js基于dgram数据报模块创建UDP服务器和客户端操作示例
2020/02/12 Javascript
vue实现户籍管理系统
2020/05/29 Javascript
Vuex的热更替如何实现
2020/06/05 Javascript
JavaScript this指向相关原理及实例解析
2020/07/10 Javascript
jQuery实现购物车全功能
2021/01/11 jQuery
python求pi的方法
2014/10/08 Python
使用Pyrex来扩展和加速Python程序的教程
2015/04/13 Python
python保存字符串到文件的方法
2015/07/01 Python
分享几道你可能遇到的python面试题
2017/07/24 Python
利用anaconda保证64位和32位的python共存
2021/03/09 Python
Django 创建后台,配置sqlite3教程
2019/11/18 Python
HTML5新标签兼容——> 的两种方法
2018/09/12 HTML / CSS
美国五金商店:Ace Hardware
2018/03/27 全球购物
《散步》教学反思
2014/03/02 职场文书
董事长助理工作职责范本
2014/07/01 职场文书
合伙经营协议书范本(通用版)
2014/12/03 职场文书
Python使用socket去实现TCP客户端和TCP服务端
2022/04/12 Python