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中用fork()函数生成的子进程
May 04 Python
Python实现二维数组按照某行或列排序的方法【numpy lexsort】
Sep 22 Python
python 与服务器的共享文件夹交互方法
Dec 27 Python
Django使用redis缓存服务器的实现代码示例
Apr 28 Python
Django框架使用mysql视图操作示例
May 15 Python
利用Python裁切tiff图像且读取tiff,shp文件的实例
Mar 10 Python
Python搭建Keras CNN模型破解网站验证码的实现
Apr 07 Python
Xadmin+rules实现多选行权限方式(级联效果)
Apr 07 Python
Python 中由 yield 实现异步操作
May 04 Python
python3.9和pycharm的安装教程并创建简单项目的步骤
Feb 03 Python
关于Python OS模块常用文件/目录函数详解
Jul 01 Python
Python可视化学习之seaborn调色盘
Feb 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
php UNIX时间戳用法详解
2017/02/16 PHP
PHP登录验证功能示例【用户名、密码、验证码、数据库、已登陆验证、自动登录和注销登录等】
2019/02/25 PHP
使用jquery hover事件实现表格的隔行换色功能示例
2013/09/03 Javascript
javascript 自定义回调函数示例代码
2014/09/26 Javascript
javascript中parseInt()函数的定义和用法分析
2014/12/20 Javascript
Javascript基础教程之while语句
2015/01/18 Javascript
jQuery实现伸展与合拢panel的方法
2015/04/30 Javascript
js与applet相互调用的方法
2016/06/22 Javascript
jQuery插件扩展实例【添加回调函数】
2016/11/26 Javascript
JS 组件系列之Bootstrap Table 冻结列功能IE浏览器兼容性问题解决方案
2017/06/30 Javascript
AngularJS实现的省市二级联动功能示例【可对选项实现增删】
2017/10/26 Javascript
Bootstrap开发中Tab标签页切换图表显示问题的解决方法
2018/07/13 Javascript
利用Blob进行文件上传的完整步骤
2018/08/02 Javascript
vue根据进入的路由进行原路返回的方法
2018/09/26 Javascript
Vue中的v-for指令不起效果的解决方法
2018/09/27 Javascript
浅谈angular表单提交中ng-submit的默认使用方法
2018/09/30 Javascript
vue 中基于html5 drag drap的拖放效果案例分析
2018/11/01 Javascript
详解jQuery如何实现模糊搜索
2019/05/10 jQuery
el-input 标签中密码的显示和隐藏功能的实例代码
2019/07/19 Javascript
Python 字符串与数字输出方法
2018/07/16 Python
Python爬虫实现抓取京东店铺信息及下载图片功能示例
2018/08/07 Python
Python函数装饰器常见使用方法实例详解
2019/03/30 Python
使用Python做定时任务及时了解互联网动态
2019/05/15 Python
Python实现列表中非负数保留,负数转化为指定的数值方式
2020/06/04 Python
解决pycharm中的run和debug失效无法点击运行
2020/06/09 Python
python绘制趋势图的示例
2020/09/17 Python
如何一键升级Python所有包
2020/11/05 Python
Html5页面上如何禁止手机虚拟键盘弹出
2020/03/19 HTML / CSS
英国最大的宝石首饰超市:QP Jewellers
2018/09/23 全球购物
自强之星事迹材料
2014/05/12 职场文书
道德演讲稿
2014/05/21 职场文书
遗失说明具结保证书
2015/02/26 职场文书
初一数学教学反思
2016/02/17 职场文书
2019同学聚会主持词
2019/05/06 职场文书
Django debug为True时,css加载失败的解决方案
2021/04/24 Python