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的加密模块md5、sha、crypt使用实例
Sep 28 Python
使用pygame模块编写贪吃蛇的实例讲解
Feb 05 Python
详解Python中如何写控制台进度条的整理
Mar 07 Python
python配置grpc环境
Jan 01 Python
linux查找当前python解释器的位置方法
Feb 20 Python
Django框架HttpResponse对象用法实例分析
Nov 01 Python
python 调试冷知识(小结)
Nov 11 Python
python绘制BA无标度网络示例代码
Nov 21 Python
浅谈Tensorflow 动态双向RNN的输出问题
Jan 20 Python
python基础之函数的定义和调用
Oct 24 Python
python工具dtreeviz决策树可视化和模型可解释性
Mar 03 Python
Pandas 数据编码的十种方法
Apr 20 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
简单示例AJAX结合PHP代码实现登录效果代码
2008/07/25 PHP
20个PHP常用类库小结
2011/09/11 PHP
php数字运算验证码的实现代码
2015/07/30 PHP
PHP使用内置函数生成图片的方法详解
2016/05/09 PHP
php实现微信公众号创建自定义菜单功能的实例代码
2019/06/11 PHP
js获取url参数的使用扩展实例
2007/12/29 Javascript
js arguments.callee的应用代码
2009/05/07 Javascript
Javascript中string转date示例代码
2013/11/01 Javascript
Javascript访问器属性实例分析
2014/12/30 Javascript
实例详解Nodejs 保存 payload 发送过来的文件
2016/01/14 NodeJs
JS简单获取及显示当前时间的方法
2016/08/03 Javascript
Vue.js一个文件对应一个组件实践
2016/10/27 Javascript
Vue 组件间的样式冲突污染
2017/08/31 Javascript
JavaScript实现图片放大镜效果
2019/06/27 Javascript
vue中的面包屑导航组件实例代码
2019/07/01 Javascript
element中table高度自适应的实现
2020/10/21 Javascript
Python Queue模块详解
2014/11/30 Python
介绍Python中的一些高级编程技巧
2015/04/02 Python
深入理解python中的浅拷贝和深拷贝
2016/05/30 Python
分享一个可以生成各种进制格式IP的小工具实例代码
2017/07/28 Python
python实现一个简单的并查集的示例代码
2018/03/19 Python
浅谈PYTHON 关于文件的操作
2019/03/19 Python
Python实现定时执行任务的三种方式简单示例
2019/03/30 Python
Win10下Python3.7.3安装教程图解
2019/07/08 Python
在PyCharm中实现添加快捷模块
2020/02/12 Python
Python用来做Web开发的优势有哪些
2020/08/05 Python
利于python脚本编写可视化nmap和masscan的方法
2020/12/29 Python
在阿尔卑斯山或希腊度过快乐假期:Alpine Elements
2019/12/28 全球购物
介绍一下Linux中的链接
2016/06/05 面试题
商场经理竞聘演讲稿
2014/01/01 职场文书
大学毕业自我评价
2014/02/02 职场文书
彩妆大赛策划方案
2014/05/13 职场文书
体育口号大全
2014/06/18 职场文书
银行求职信模板
2015/03/20 职场文书
2016年国庆节新闻稿范文
2015/11/25 职场文书
聊聊Python String型列表求最值的问题
2022/01/18 Python