Python HTTP客户端自定义Cookie实现实例
PythonHTTP客户端自定义Cookie实现实例
几乎所有脚本语言都提供了方便的HTTP客户端处理的功能,Python也不例外,使用urllib和urllib2可以很方便地进行HTTPGET和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的后面,然后检查已经存在的cookieheader,再进行合并一下。不过比较诡异的是在Python的文档里并没有找到Request对象有get_header之类的方法可以得到已经存在的header项的值,觉得很诡异,于是直接查了源代码,才找到了,确实有这个方法。之前有听人说过Ruby的文档做得如何如何的烂,Python的文档做得如何如何的好,我虽然没觉得Ruby的文档很烂,但是也觉得Python的文档确实不错,我最喜欢它末尾的Examples。两个文档系统倒是走的不同的路,Ruby的文档是从代码中抽取(特定格式的)注释来自动生成的,类似于javadoc;而Python现在用的是独立于源代码的文档系统,人工写的,不过到头来居然连函数都漏掉了,可见人工维护文档的弊端还是很明显的。其实我见过的文档系统,最好用的应该还是属于Emacs/Elisp了吧。不过,废话少讲,handler如下:
classSimpleCookieHandler(urllib2.BaseHandler): defhttp_request(self,req): simple_cookie='cc98Simple=1' ifnotreq.has_header('Cookie'): req.add_unredirected_header('Cookie',simple_cookie) else: cookie=req.get_header('Cookie') req.add_unredirected_header('Cookie',simple_cookie+';'+cookie) returnreq
然后,构造opener的时候加上这个handler就可以了:
opener=urllib2.build_opener(urllib2.HTTPCookieProcessor(), SimpleCookieHandler())
但总归是一个workaround,期待那个patch被加入到标准库中吧。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!