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中return和finally共同挖的坑
Aug 18 Python
python3.5 tkinter实现页面跳转
Jan 30 Python
Linux下python与C++使用dlib实现人脸检测
Jun 29 Python
Python操作配置文件ini的三种方法讲解
Feb 22 Python
python实现弹窗祝福效果
Apr 07 Python
Python使用pyautocad+openpyxl处理cad文件示例
Jul 11 Python
浅谈Django中view对数据库的调用方法
Jul 18 Python
Django stark组件使用及原理详解
Aug 22 Python
python中class的定义及使用教程
Sep 18 Python
python调用HEG工具批量处理MODIS数据的方法及注意事项
Feb 18 Python
python实现opencv+scoket网络实时图传
Mar 20 Python
python 多线程中join()的作用
Oct 29 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
真正的ZIP文件操作类(php)
2007/07/21 PHP
PHP中is_dir()函数使用指南
2015/05/08 PHP
ThinkPHP框架里隐藏index.php
2016/04/12 PHP
使用ThinkPHP生成缩略图及显示
2017/04/27 PHP
使用PHPExcel实现数据批量导出为excel表格的方法(必看)
2017/06/09 PHP
php高性能日志系统 seaslog 的安装与使用方法分析
2020/02/29 PHP
什么是cookie?js手动创建和存储cookie
2014/05/27 Javascript
Ext GridPanel加载完数据后进行操作示例代码
2014/06/17 Javascript
JQuery跳出each循环的方法
2015/04/16 Javascript
浅谈JS继承_寄生式继承 & 寄生组合式继承
2016/08/16 Javascript
老生常谈JavaScript中的this关键字
2016/10/01 Javascript
Bootstrap优化站点资源、响应式图片、传送带使用详解3
2016/10/14 Javascript
javascript ES6 新增了let命令使用介绍
2017/07/07 Javascript
vue实现多个元素或多个组件之间动画效果
2018/09/25 Javascript
jQuery 图片查看器插件 Viewer.js用法简单示例
2020/04/04 jQuery
基于redis的小程序登录实现方法流程分析
2020/05/25 Javascript
Js实现粘贴上传图片的原理及示例
2020/12/09 Javascript
Python输出汉字字库及将文字转换为图片的方法
2016/06/04 Python
python实现可以断点续传和并发的ftp程序
2016/09/13 Python
Django框架创建项目的方法入门教程
2019/11/04 Python
html5 input输入实时检测以及延时优化
2018/07/18 HTML / CSS
手工制作的意大利太阳镜和光学元件:Illesteva
2019/01/19 全球购物
音乐学院硕士生的自我评价分享
2013/11/01 职场文书
会计专业职业规划:规划自我赢取未来
2014/02/12 职场文书
招聘专员岗位职责
2014/03/07 职场文书
文案策划求职信
2014/03/18 职场文书
工会趣味活动方案
2014/08/18 职场文书
民主生活会整改措施(党员)
2014/09/18 职场文书
学生检讨书范文
2015/01/27 职场文书
2015年团队工作总结范文
2015/05/04 职场文书
党支部季度考核意见
2015/06/02 职场文书
跑出一片天观后感
2015/06/08 职场文书
六年级语文教学反思
2016/03/03 职场文书
2019暑假阅读倡议书
2019/06/24 职场文书
SQL Server中常用截取字符串函数介绍
2022/03/16 SQL Server
SQL Server表分区降低运维和维护成本
2022/04/08 SQL Server