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 21 Python
在Django的URLconf中进行函数导入的方法
Jul 18 Python
python 切换root 执行命令的方法
Jan 19 Python
详解Python 定时框架 Apscheduler原理及安装过程
Jun 14 Python
pip指定python位置安装软件包的方法
Jul 12 Python
python3 批量获取对应端口服务的实例
Jul 25 Python
Python 多线程搜索txt文件的内容,并写入搜到的内容(Lock)方法
Aug 23 Python
Python 限定函数参数的类型及默认值方式
Dec 24 Python
pytorch数据预处理错误的解决
Feb 20 Python
Python拼接字符串的7种方式详解
Mar 19 Python
梳理总结Python开发中需要摒弃的18个坏习惯
Jan 22 Python
python数据分析之单因素分析线性拟合及地理编码
Jun 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 第二节 数据类型之数值型
2012/04/28 PHP
php中的filesystem文件系统函数介绍及使用示例
2014/02/13 PHP
让ThinkPHP的模板引擎达到最佳效率的方法详解
2017/03/14 PHP
基于jQuery的360图片展示实现代码
2012/06/14 Javascript
使用原生js封装webapp滑动效果(惯性滑动、滑动回弹)
2014/05/06 Javascript
jQuery获取iframe的document对象的方法
2014/10/10 Javascript
jQuery 和 CSS 的文本特效插件集锦
2014/12/12 Javascript
jQuery学习笔记之jQuery中的$
2015/01/19 Javascript
javascript十六进制及二进制转化的方法
2015/05/06 Javascript
一道优雅面试题分析js中fn()和return fn()的区别
2016/07/05 Javascript
jQ处理xml文件和xml字符串的方法(详解)
2016/11/22 Javascript
js实现前端分页页码管理
2017/01/06 Javascript
vue图片加载与显示默认图片实例代码
2017/03/16 Javascript
JavaScript反射与依赖注入实例详解
2018/05/29 Javascript
vue 判断两个时间插件结束时间必选大于开始时间的代码
2020/11/04 Javascript
python计算程序开始到程序结束的运行时间和程序运行的CPU时间
2013/11/28 Python
python实现mysql的单引号字符串过滤方法
2015/11/14 Python
简单总结Python中序列与字典的相同和不同之处
2016/01/19 Python
python制作爬虫爬取京东商品评论教程
2016/12/16 Python
Python操作rabbitMQ的示例代码
2019/03/19 Python
解决python中用matplotlib画多幅图时出现图形部分重叠的问题
2019/07/07 Python
Python简易版图书管理系统
2019/08/12 Python
Django admin禁用编辑链接和添加删除操作详解
2019/11/15 Python
PYQT5开启多个线程和窗口,多线程与多窗口的交互实例
2019/12/13 Python
利用python中的matplotlib打印混淆矩阵实例
2020/06/16 Python
微信小程序之html5 canvas绘图并保存到系统相册
2019/06/20 HTML / CSS
Public Desire美国/加拿大:全球性的在线鞋类品牌
2018/12/17 全球购物
自荐信结尾
2013/10/27 职场文书
电子商务专业个人的自我评价
2013/12/19 职场文书
英语感恩演讲稿
2014/01/14 职场文书
战友聚会邀请函
2014/01/18 职场文书
公司委托书格式范文
2014/04/04 职场文书
南京青奥会口号
2014/06/12 职场文书
盗窃案辩护词
2015/05/21 职场文书
公司仓库管理制度
2015/08/04 职场文书
导游词之台湾阿里山
2019/10/23 职场文书