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求众数问题实例
Sep 26 Python
详解Python验证码识别
Jan 25 Python
Python类属性的延迟计算
Oct 22 Python
http请求 request失败自动重新尝试代码示例
Jan 25 Python
CentOS 7下安装Python3.6 及遇到的问题小结
Nov 08 Python
python实现石头剪刀布小游戏
Jan 20 Python
解决Python3 抓取微信账单信息问题
Jul 19 Python
基于django传递数据到后端的例子
Aug 16 Python
在notepad++中实现直接运行python代码
Dec 18 Python
PyTorch 普通卷积和空洞卷积实例
Jan 07 Python
超级实用的8个Python列表技巧
Aug 24 Python
用python获取txt文件中关键字的数量
Dec 24 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相关资料
2006/10/09 PHP
教你如何在CI框架中使用 .htaccess 隐藏url中index.php
2014/06/09 PHP
php单态设计模式(单例模式)实例
2014/11/18 PHP
JavaScript 事件冒泡简介及应用
2010/01/11 Javascript
jQuery html() in Firefox (uses .innerHTML) ignores DOM changes
2010/03/05 Javascript
JavaScript Distilled 基础知识与函数
2010/04/07 Javascript
jquery文字上下滚动的实现方法
2013/03/22 Javascript
JQuery拖动表头边框线调整表格列宽效果代码
2014/09/10 Javascript
jQuery实现购物车数字加减效果
2015/03/14 Javascript
JavaScript实现下拉菜单的显示和隐藏
2016/01/05 Javascript
js 能实现监听F5页面刷新子iframe 而父页面不刷新的方法
2016/11/09 Javascript
jquery网页日历显示控件calendar3.1使用详解
2016/11/24 Javascript
JavaScript中${pageContext.request.contextPath}取值问题及解决方案
2016/12/08 Javascript
ionic2自定义cordova插件开发以及使用(Android)
2017/06/19 Javascript
基于Bootstrap分页的实例讲解(必看篇)
2017/07/04 Javascript
Vue的土著指令和自定义指令实例详解
2018/02/04 Javascript
解决layui-table单元格设置为百分比在ie8下不能自适应的问题
2019/09/28 Javascript
浅谈webpack构建工具配置和常用插件总结
2020/05/11 Javascript
在vue中使用Echarts利用watch做动态数据渲染操作
2020/07/20 Javascript
Flask入门教程实例:搭建一个静态博客
2015/03/27 Python
详解Python中for循环的使用
2015/04/14 Python
Python处理JSON数据并生成条形图
2016/08/05 Python
Python实现的绘制三维双螺旋线图形功能示例
2018/06/23 Python
python框架Django实战商城项目之工程搭建过程图文详解
2020/03/09 Python
HTML5中判断横屏竖屏的方法(移动端)
2016/08/04 HTML / CSS
eBay意大利购物网站:eBay.it
2019/09/04 全球购物
伦敦香水公司:The London Perfume Company
2019/11/13 全球购物
Timberland俄罗斯官方网上商店:全球领先的户外品牌
2020/03/15 全球购物
数控技术应届生求职信
2013/11/13 职场文书
最受欢迎的自我评价
2013/12/22 职场文书
物理教学随笔感言
2014/02/22 职场文书
校园演讲稿汇总
2014/05/21 职场文书
环保宣传标语
2014/06/12 职场文书
运动会演讲稿300字
2014/08/25 职场文书
大学生求职简历自我评价
2015/03/02 职场文书
2016年小学圣诞节活动总结
2016/03/31 职场文书