Requests源码阅读

image

很久之前阅读的,差点忘了


一、_Requests??榈淖饔?/h3>
class _Request(urllib2.Request):
    """Hidden wrapper around the urllib2.Request object. Allows for manual
    setting of HTTP methods.
    """

    def __init__(self, url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None):
        urllib2.Request.__init__(self, url, data, headers, origin_req_host, unverifiable)
        self.method = method

    def get_method(self):
        if self.method:
            return self.method

        return urllib2.Request.get_method(self)

刚开始看时,不太注意注释里面的英文,然后就看它作用是继承urllib2.Request??椴⒏男匆幌耮et_method(),这里就有点迷糊了,改写get_method()作用是什么。
于是去看了urllib2关于get_method()的文档,文档就一句话就没有怎么留意,下面是文档原话:

Request.get_method()
    Return a string indicating the HTTP request method. This is only meaningful for HTTP requests, and currently always returns 'GET' or 'POST'.

这句话说的是,返回一个指示HTTP请求的方法。只对HTTP请求有效,目前总是返回'GET'或者'POST'。使用过Requets的人都知道,Requests不仅仅有GET和POST请求,还有HEAD、POST、DELETE等请求,所以这里重写了get_method,让它自动根据传进来的method进行hack(钩子)方式的添加其它类型HTTP请求方式。一般直接使用urllib2,可以如下这样实现其他类型请求:

import urllib2

request = urllib2.Request(uri, data=data)
request.get_method = lambda: 'PUT' # or 'DELETE'
response = urllib2.urlopen(request)

这是我第二次回顾源码前面的细节,真的要仔细看源码和注释才行,之前只是过了一遍。

二、Reqeusts中的认证???/h3>
if isinstance(auth, (list, tuple)):
    auth = AuthObject(*auth)
if not auth:
    auth = auth_manager.get_auth(self.url)
self.auth = auth

判断auth是否list或者tuple类型,如果是,就调用自定义的自动选择认证handlers???,
urllib2中认证相关的处理??橹饕幸韵录钢郑?/p>

HTTPBasicAuthHandler(password_mgr=None)             #处理与远程主机的身份验证
HTTPDigestAuthHandler(password_mgr=None)            
ProxyBasicAuthHandler(password_mgr=None)            # 处理与代理的身份验证
ProxyDigestAuthHandler(password_mgr=None)

这些处理类都在urllib2中定义,看Requests源码很多时候需要了解urllib2??榈南喙毓δ埽枰亩燎氲秸饫?a target="_blank">Python2 urllib2??槲牡?, 需要看该??榈脑绰氲幕埃梢匀?a target="_blank">Python3 urllib.request??樵绰?/a>参看源码。
如果没有auth对象,则调用自定义的AuthManager类来注册一个auth对象,关于AuthManager类,里面使用了单例模式,还有重写了 HTTPPasswordMgr类的几个函数,细节请阅读urllib.request??樵绰?/a>中的HTTPPasswordMgr。

三、_get_opener()函数

handlers的处理都放在这里,要了解这个函数,就必须了解urllib2怎么处理封装Handlers,
Openers对象(一个urllib2.OpenerDirector的实例),如何构建(build_opener)、如何安装全局(install_opener)
(待改进)

四、代码重构

在v0.3.4版本中重构了整个项目,使功能模块更加清晰

0.3.4
+++++

* Urllib2 HTTPAuthentication Recursion fix (Basic/Digest)
* Internal Refactor
* Bytes data upload Bugfix

解决了urllib2??榇嬖诘娜现の侍?,就是输入错误的密码认证,会无限循环认证下去,具体请看urllib2 Recursion issue.再看代码重构后的requests目录下:

# 重构后
requests
├── api.py            
├── async.py                # moneypatch 猴子补丁
├── core.py
├── __init__.py             # contextmanager
├── models.py               # 以前core.py中的代码,主要是Request、Response类
├── monkeys.py              # 重写urllib2相关类的实现
├── packages                # 第三方库,关于上传文件相关的。
│   ├── __init__.py
│   └── poster
│       ├── encode.py
│       ├── __init__.py
│       ├── streaminghttp.py
├── patches.py
└── structures.py           # 来自于 werkzeug 的多key字典之类的数据结构


重构前
├── requests
│   ├── async.py
│   ├── core.py             # 所有代码都在这里
│   ├── __init__.py         # contextmanager
│   ├── packages            # 同上
│   │   ├── __init__.py
│   │   └── poster
│   │       ├── encode.py
│   │       ├── __init__.py
│   │       ├── streaminghttp.py
│   └── structures.py

这样的确代码清晰好多,比如重写urllib2的类就可以全部放在monkeys.py,以后需要重写其他标准库的类也同样放在里面,维护起来就方便很多

五、看Pull Request

其实,各种功能讨论和bug修复,都可以在PR里面看到更详细的内容,可以看到那些贡献者的讨论,还是有一点用的吧。。。
发现jgorset这个贡献者很活跃,从版本0.。。。忘了, 就是很早的版本他都不断提交PR,很多代码结构的重构都是他PR上去的,应该是个牛人。

v0.5.0
第五版改动还真是很大啊,搞得我都看得有点懵了,总的来说很多细节方面进行了优化,
测试用例也有很大的改动,统一了测试使用的URL。

未完待续。。。。

?著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,100评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,308评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事?!?“怎么了?”我有些...
    开封第一讲书人阅读 159,718评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,275评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,376评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,454评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,464评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,248评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,686评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,974评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,150评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,817评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,484评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,140评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,374评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,012评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,041评论 2 351

推荐阅读更多精彩内容