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方法如下:
|
|
异常相关
不做过多解释。