当前位置: 首页 > 编程笔记 >

Python HTTP客户端自定义Cookie实现实例

董高朗
2023-03-14
本文向大家介绍Python HTTP客户端自定义Cookie实现实例,包括了Python HTTP客户端自定义Cookie实现实例的使用技巧和注意事项,需要的朋友参考一下

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 被加入到标准库中吧。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

 类似资料:
  • 问题内容: 我正在与socket.io聊天应用程序,我想用我的自定义客户端ID,而不是默认的(,)。连接时是否有任何发送自定义标识符的方式,或仅使用某种方式来跟踪每个ID的自定义名称?谢谢! 问题答案: 您可以在服务器上创建一个数组,并在其上存储自定义对象。例如,您可以存储Socket.io创建的ID和每个客户端发送到服务器的自定义ID: 在此示例中,您需要从每个客户端调用 storeClient

  • 我一直在使用FTP客户端java实现。我所要做的就是连接到FTP服务器并将一个文件传输到服务器。 我设法与ftp服务器建立了连接(见下面的代码),之后我使用PASV命令进入了被动模式。现在我不知道下一步该做什么。我尝试在PASV命令之后制作一个新套接字并将其连接到FTP服务器端口20,但没有成功。 我的问题是建立连接时如何启动文件传输?(我的想法是与端口20建立连接并执行STOR命令,但我不知道如

  • 根据Intellij的说法。这是由Spring Cloud Netflix框架自动生成的类型,因此尝试与远程服务进行实际通信。 是否有一种方法可以根据配置设置有条件地重写Feign接口的实现?

  • 14.2.实现远程客户端 我们已经有了远程Service,接下来实现它的客户端,然后测试两者是否工作正常。我们这里有意将服务端与客户端分在两个不同的package中,因为它们是两个独立的程序。 好,在Eclipse中新建一个项目,步骤同以前一样,兹不赘述。不过这里有一点不同,那就是它依赖于前一个项目,也就是LogService。这一点很重要,因为LogClient需要知道LogService的接口

  • 有没有我可以参考的示例应用程序用于Android上的SAML交互?有人在Android上成功移植/使用了OpenSAML吗? 我正在尝试编写一个简单的应用程序,它将(而不是浏览器重定向)使用本机API来执行SAML身份验证。 还有一些指向测试环境的指针,我可以在其中测试SAML客户机,这会有所帮助。

  • 是否可以在Silverlight中创建代理客户端,这意味着Silverlight应用程序知道代理服务器的主机、端口、用户名和密码,然后建立与代理服务器的连接? 然后,Silverlight应用程序将能够向该代理服务器后面的资源发出HTTP请求。 这样,Silverlight应用程序就可以访问某些资源,而无需首先在客户端计算机上安装第三方代理客户端,因为代理客户端将是Silverlight应用程序本