requests库基本上是玩爬虫的兄弟伙们所接触的第一课,也是公认的python最好上手的http请求库。此库基于标准库urllib(最开始是urllib2)重新造轮子,用起来非常安逸。而且,这也是传说中最pythonic的代码,毕竟作者是公认的python界前三位的大神之一,本文将先从初始版本(0.2.0版本)开始阅读源码,尽量理解作者设计思路
01拉取版本源码
写这个是因为有些同学可能不是用的git,或是刚刚接触git,不知道如何拿到tag版本的源码,这里说一下哈,两种方法
02初始版本的结构目录
03readme文件
截取了一部分原readme,总的来说,就是大神当时觉得已存在的python语言的http库都极其难用,所以想重新造轮子,并在此文件中体现了自己对于库设计的理念以及如何非常容易上手这个项目的使用(介绍了如何进行http/https请求的例子)对于一个项目来说,readme是所有人想了解你项目的第一步,大神的readme确实非常“嚣张”,但确实够吸引人,也确实好用,不然怎么叫大神呢(所以如果自己的项目,一定要认真对待readme文件,readme让别人感兴趣,别人才可能研究并使用你的项目)看下大神的叫嚣……
04history文件
只传达出了一个意思,requests正式版本由0.2.0开始,时间为2011-02-14
05core文件
通过分析,可以看得出来,核心代码文件为core.py,行数不多,只有400行左右的样子,我们从get方法的调用过程来看(get是最最最基础的)
get源码
首先实例化,生成一个Request对象,然后将初始化方法的属性重新设置,只有一个例外,就是auth_detect_autu方法说白了,因为有些网站需要用户名和密码的认证,才能访问,所以这里就是为了调用urllib2中用来处理这种情况的handler,下面我们来看一下代码(以下这几个函数/类需要放在一起看)
4.最后一步,调用send方法
Request类
先看下send方法的源码
self._checks(),先检验url是否有问题,很简单,不说了if (not self.sent) or anyway :我是这样理解的,假设说我们用Request实例对象去请求相同的请求,那么第一次成功的话,就会将self.sent设置为True,那么接下来的重复请求就不会发起了,除非将anyway设置为True,那么才会再此发起相同的请求,反正第一次请求是绝对会正常执行的urllib.urlencode(self.params) 就是将请求参数编码_Request(("%s?%s" % (self.url, params)), method=self.method)是将域名 + 请求拼接完整,这样服务器才知道客户端的请求内容_get_opener(代码在下面)就是找让哪些handler来处理相关的url请求,这里作者考虑的是如果需要基础验证,则创建一个HTTPBasicAuthHandler的实例,并让opener使用这个handler ,否则就用urllib2.urlopen函数即可。(urlopen其实是opener的一个实例,内部也还是调用了build_opener函数去拿到handlers,在urllib2的原生代码,想要理解,还需要看下urllib2的源码,其实注释的比较清晰了)接下来就比较简单了,将_Request实例对象发送给服务器,如果是没有鉴权,那就相当于resp = urllib2.urlopen(urllib2.Reuqest())了最后的最后则是通过属性接收响应结果
__setattr__方法
这个__setattr__就是对url请求方法做了一个限制,只支持类属性_METHODS中存在的请求方法
本文<完>!
我是一名奋战在编程界的pythoner,工作中既要和数据打交道,也要和erp系统,web网站保持友好的沟通……时不时的会分享一些提高效率的编程小技巧,在实际应用中遇到的问题以及解决方案,或者源码的阅读等等,欢迎大家一起来讨论!如果觉得写得还不错,欢迎关注点赞,谢谢。