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代码
Mar 13 Python
分享一下Python 开发者节省时间的10个方法
Oct 02 Python
深入讲解Python编程中的字符串
Oct 14 Python
python中利用await关键字如何等待Future对象完成详解
Sep 07 Python
Python 判断 有向图 是否有环的实例讲解
Feb 01 Python
解决python大批量读写.doc文件的问题
May 08 Python
python制作抖音代码舞
Apr 07 Python
聊聊python中的循环遍历
Sep 07 Python
如何使用Python进行PDF图片识别OCR
Jan 22 Python
Python中os模块的简单使用及重命名操作
Apr 17 Python
详解运行Python的神器Jupyter Notebook
Jun 03 Python
Python爬虫 简单介绍一下Xpath及使用
Apr 26 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使用PDO操作MySQL数据库实例
2014/12/30 PHP
Linux操作系统安装LAMP环境
2015/06/26 PHP
PHP的关于变量和日期处理的一些面试题目整理
2015/08/10 PHP
PHP图片水印类的封装
2017/07/06 PHP
学习thinkphp5.0验证类使用方法
2017/11/16 PHP
PHP使用SMTP邮件服务器发送邮件示例
2018/08/28 PHP
PHP7新增函数
2021/03/09 PHP
return false;和e.preventDefault();的区别
2010/07/11 Javascript
Node.js:Windows7下搭建的Node.js服务(来玩玩服务器端的javascript吧,这可不是前端js插件)
2011/06/27 Javascript
Jquery之Ajax运用 学习运用篇
2011/09/26 Javascript
可恶的ie8提示缺少id未定义
2014/03/20 Javascript
JS实现根据用户输入分钟进行倒计时功能
2016/11/14 Javascript
微信小程序websocket实现聊天功能
2020/03/30 Javascript
node.js实现http服务器与浏览器之间的内容缓存操作示例
2020/02/11 Javascript
在vue-cli创建的项目中使用sass操作
2020/08/10 Javascript
在vue项目中promise解决回调地狱和并发请求的问题
2020/11/09 Javascript
微信小程序实现登录注册功能
2020/12/29 Javascript
[02:15]2014DOTA2国际邀请赛 专访LGD.lin小兔子是大腿
2014/07/14 DOTA
Python比较两个图片相似度的方法
2015/03/13 Python
Python的Flask框架中实现登录用户的个人资料和头像的教程
2015/04/20 Python
Python实现采用进度条实时显示处理进度的方法
2017/12/19 Python
Python自动化测试中yaml文件读取操作
2020/08/20 Python
Python浮点型(float)运算结果不正确的解决方案
2020/09/22 Python
Python通过Schema实现数据验证方式
2020/11/12 Python
CSS3教程(4):网页边框和网页文字阴影
2009/04/02 HTML / CSS
美国按摩椅批发网站:Titan Chair
2018/12/27 全球购物
L*SPACE官网:比基尼、泳装和度假服装
2019/03/18 全球购物
Audible英国:有声读物,30天免费试用
2019/10/16 全球购物
学校创先争优活动总结
2014/08/28 职场文书
幼儿园开学温馨提示
2015/07/15 职场文书
总经理致辞
2015/07/29 职场文书
宣传部部长竞选稿
2015/11/21 职场文书
2016年暑假学生家长评语
2015/12/01 职场文书
C站最全Python标准库总结,你想要的都在这里
2021/07/03 Python
HTML中的表单元素介绍
2022/02/28 HTML / CSS
Python中的matplotlib绘制百分比堆叠柱状图,并为每一个类别设置不同的填充图案
2022/04/20 Python