Requests v0.2.0 源码阅读
v0.2.0
|
|
从 https://github.com/requests/requests/releases?after=v0.3.0 知道 v0.2.0 发布时的 commit为 https://github.com/requests/requests/commit/d2427ecae751a533ddd9026849dd19cfaa3394f4 。检出。
项目结构
name | usage |
---|---|
docs | 保存文档 |
requests | 保存源代码 |
.gitignore | 略 |
HISTORY.rst | 历史 |
LICENSE | 协议 |
README.rst | readme |
setup.py | 安装 |
test_requests.py | 测试 |
test_requests.py
定义如上方法,用于进行功能测试。
requests
主要关注 core.py
UML图:
Structure:
主要实现四种类:请求基类_Request
、请求类Request
、响应类Response
、认证AuthObject
,七种方法:get、post、put、delete和认证相关的方法,四种异常类。
_Request 类
对urllib2.Request
对象 的封装,允许对请求方法进行s手动设置。
Request 类
附上一些私有变量和私有方法:
Request类主要用于发送请求,因此重点关注其中的send
方法,注释中解释了几点:
- 发送请求,成功返回
True
,失败返回False
- 如果传输过程中出错,则
self.response.status_code
会包含错误代码 - 一旦请求成功发送,则Request类的
sent
属性会变为True
anyway
参数若被设为True,则请求一定会被发送,不管是否曾发送过,
|
|
在send中,会先进行self._checks()
检查:
这里只检测了URL是否设置,若没有则抛出URLRequired
错误。然后根据method
的不同分情况send请求,如果发送成功则success为True,sent变量也为True,然后返回success变量。
‘GET’, ‘HEAD’, ‘DELETE’
添加注释,代码如下:
|
|
‘PUT’
添加注释,代码如下:
‘POST’
添加注释,代码如下:
Response 类
在 Request
类中我们见到在Request初始化__init__
时设置了self.response = Response()
。然后根据请求方法的不同,设置状态码self.response.status_code
、响应头部self.response.headers
、响应内容self.response.content
。接下来就看看response
类是如何实现的。
|
|
AuthObject 类
该类暂时仅在 test_requests.py
中出现,用于设置认证的用户名和密码。代码如下:
请求方法
get、post、put、delete和认证相关的方法 ,在代码结构上大同小异。
get
|
|
head
|
|
post
|
|
put
|
|
delete
|
|
认证相关
从上面的请求方法实现中,可以发现有的请求带了如r.auth = _detect_auth(url, auth)
对于种种请求方法,我们不想在每次请求中都明确指出这次请求需不需要认证,但有些请求确实需要认证,因此在各种请求方法中都有一个可选参数auth=None
,然后通过调用r.auth = _detect_auth(url, auth)
来进一步设置。_detect_auth
代码如下
|
|
对于明确指出需要认证的请求,自然auth
参数也会指定。如果auth
参数没有指定,则会调用_get_autoauth
来查看是否有对应的规则。这个规则列表则由全局变量AUTOAUTHS
来维护,如果请求的url包含autoauth_url
,则返回autoauth_url
对应的auth。如果不包含,则直接返回None
。
为了维护这个全局变量AUTOAUTHS
,它实现了一个add_autoauth
方法如下:
|
|
异常相关
不做过多解释。