最近德云社演员“有房有车还募捐”的事情正在发酵,开源圈里关于技术募捐也曝出了丑闻,主角是知名
Python 库 Requests 作者 Kenneth Reitz。

python中requests模块的使用方法,pythonrequests模块

本文实例讲述了python中requests模块的使用方法。分享给大家供大家参考。具体分析如下:

澳门新葡萄京官网注册,在HTTP相关处理中使用python是不必要的麻烦,这包括urllib2模块以巨大的复杂性代价获取综合性的功能。相比于urllib2,Kenneth
Reitz的Requests模块更能简约的支持完整的简单用例。

简单的例子:

想象下我们试图使用get方法从
或者Requests都是很容易实现的。

urllib2 

>>> import urllib2 
>>> url = 'http://example.test/' 
>>> response = urllib2.urlopen(url)
>>> response.getcode() 
200 
>>> response.headers.getheader('content-type') 
'text/html; charset=utf-8'
>>> response.read() 
'Hello, world!'

Requests

>>> import requests 
>>> url = 'http://example.test/' 
>>> response = requests.get(url) 
>>> response.status_code 
200 
>>> response.headers['content-type']
'text/html; charset=utf-8'
>>> response.content 
u'Hello, world!'

这两种方法很相似,相对于urllib2调用方法读取response中的属性信息,Requests则是使用属性名来获取对应的属性值。
两者还有两个细微但是很重要的差别:

1 Requests 自动的把返回信息有Unicode解码
2 Requests
自动保存了返回内容,所以你可以读取多次,而不像urllib2.urlopen()那样返回的只是一个类似文件类型只能读取一次的对象。

第二点是在python交互式环境下操作代码很令人讨厌的事情

一个复杂一点的例子:

现在让我们尝试下复杂点得例子:使用GET方法获取)
到requests.get()之间的代码换成可以发送username,password的请求就行了

这是urllib2的方法:

>>> import urllib2
>>> url = 'http://example.test/secret'
>>> password_manager = urllib2.HTTPPasswordMgrWithDefaultRealm()
>>> password_manager.add_password(None, url, 'dan', 'h0tdish')
>>> auth_handler = urllib2.HTTPBasicAuthHandler(password_manager) 
>>> opener = urllib2.build_opener(auth_handler)
>>> urllib2.install_opener(opener)
>>> response = urllib2.urlopen(url)
>>> response.getcode()
200 
>>> response.read()
'Welcome to the secret page!'

一个简单的方法中实例化了2个类,然后组建了第三个类,最后还要装载到全局的urllib2模块中,最后才调用了urlopen,那么那两个复杂的类是什么的
迷惑了吗,  这里所有urllib2的文档

那Requests是怎么样解决同样的问题的呢?

Requests

>>> import requests 
>>> url = 'http://example.test/secret' 
>>> response = requests.get(url,auth=('dan','h0tdish'))
>>> response.status_code 
200 
>>> response.content 
u'Welcome to the secret page!' 

只是在调用方法的时候增加了一个auth关键字函数
我敢打赌你不用查文档也能记住。

错误处理 Error Handling

Requests对错误的处理也是很非常方面。如果你使用了不正确的用户名和密码,urllib2会引发一个urllib2.URLError错误,然而Requests会像你期望的那样返回一个正常的response对象。只需查看response.ok的布尔值便可以知道是否登陆成功。

>>> response = requests.get(url,auth=('dan','wrongPass'))
>>> response.ok 
False 

其他的一些特性:

* Requests对于HEAD, POST, PUT, PATCH, 和 DELETE方法的api同样简单
* 它可以处理多部分上传,同样支持自动转码
* 文档更好
* 还有更多

Requests 是很好的,下次需要使用HTTP时候可以试试。

希望本文所述对大家的Python程序设计有所帮助。

本文实例讲述了python中requests模块的使用方法。分享给大家供大家参考。具体分析如下:
在…

1、Requests

澳门新葡萄京官网注册 1

Requests

  requests是python的一个HTTP客户端库,跟urllib,urllib2类似,那为什么要用requests而不用urllib2呢?下面是Requests的创建者Kenneth
Reitz对python标准库工具的评价。

python的标准库urllib2为你提供了大多数HTTP功能,但是它的API非常差劲。这是因为他是经过许多年一步步建立起来的——不同时期要面对的是不同的网络环境。于是为了完成最简单的任务,他需要耗费大量的工作。
事情不应该这样复杂,更不应该发生在python里。
Requests文档

requests处理URL非常简单,符合“人生苦短,我用python”的理念。

Python async/await-native I/O 库 Trio 作者 Nathaniel J. Smith
发文详细说明了 Kenneth Reitz 在 Requests 3
的开发过程中如何滥用社区用户的捐款的。

2、BeautifulSoup

澳门新葡萄京官网注册 2

BeautifulSoup

BeautifulSoup文档

2017 年 8 月,Nathaniel 开始为 urllib3 添加异步支持,urllib3 是 Requests
使用的底层 HTTP 库,该支持是是高度实验性的。Kenneth
对这项工作非常感兴趣,他非常希望在 Requests
中提供异步支持,但是自己又不知道怎么做。于是他开始招募志愿者以 Nathaniel
的方式去开发。

3、Selenium

几个月之后,Kenneth 宣布 Requests 3 的工作开始,并且首要新特性就是
Nathaniel 正在进行的原生 async/await 支持:

4、PhantomJS

PhantomJS文档

澳门新葡萄京官网注册 3

5、Scrapy

Scrapy文档

同时,Requests 3
项目发起募捐,以实现这一目标。很快许多个人与微软、谷歌与 Slack
等大公司都进行了捐款,筹款达到了 3 万美元左右。

随后 Kenneth 联系 Nathaniel 讨论筹款活动,Kenneth
表示不知道如何处理这笔钱,他说最初的目标只是筹集 5 千美元来买一台电脑。

Nathaniel 心里觉得 5
千美元都可以买一台强大的服务器或者高端游戏设备了,跟开发 Requests
没有什么关系,Requests 是一个小的纯 Python
库,使用任何便宜的笔记本开发都完全没问题。但他同时也理解,即使花了 5
千美元购买一些不相关的电脑,也可以将这笔费用认为是对过去的工作进行的一种补偿,而且还会留下
25 000
美元来履行他在筹款活动中所作出的承诺,不管怎么说这对于开发出一些令人惊叹的新功能其实是有帮助的。

于是 Nathaniel
提供了一些筹款和拨款的经验,强调了保持信任的透明度的重要性,并建议
Kenneth 与 Python 软件基金会(PSF)或类似的非盈利组织建立财政赞助关系。

同时 Nathaniel
试图帮助找到有效利用这笔捐款的方法,例如联系志愿者,邀请其他人参与有偿开发
Requests 3;并且在后来他离开 UC 伯克利时,还希望能够全职去参与到
Requests 的开发中。

然而在这个过程中,虽然 Kenneth 也有对 Nathaniel 在 urllib3
上的工作进行一些实验,添加了一些基本的 HTTP/2 支持,但是 Nathaniel
早就提示过这种方法不可行,最后 Kenneth 的这些代码实际上也没法用。

同时其他社区成员也听到了关于募集到的这笔资金去向的不同版本。

几个月后,Kenneth 在回复 Nathaniel 的邮件中提出了以下几点内容:

  • 他实际上只筹集到了 2 万 8 千美元
  • “大部分”都是税
  • 他希望 Nathaniel 完成(Kenneth)在 Requests 3 中为新功能所做的承诺
  • 但是完成功能并不会支付他资金,相反,需要等功能实现后,把这 2 万 8
    千美元用于编写文档
  • 如果 Nathaniel 不能在志愿地去实现功能,Kenneth
    鼓励其发起自己的筹款活动

也就是说 Kenneth 想让 Nathaniel 无偿地去开发 Requests 3
那些承诺好的异步功能,而且这笔筹集到的捐款去向也不明不白,甚至最开始募捐也是没有在
Nathaniel 本人承诺会完成异步功能的情况下发起的,而实际上完成 Python
原生 async/await 支持很难。Nathaniel 震惊了,并且拒绝了这个想法。

Kenneth
没有回应,之后他删除了网站上筹款页面收到捐款记录的页面,以及他承诺的回报(before/after)。同时更新了
Requests
文档及其博客,删除了对已删除页面的引用(before/after)。

在博客中 Nathaniel 明确指出:“实际上,他公开承诺如何使用 Requests 3
资金是彻头彻尾的谎言,他没有表现出任何悔恨,甚至不明白这是一个问题。”

Effectively, his public promises about how he would use the Requests 3
money were lies from start to finish, and he hasn’t shown any remorse
or even understanding that this is a problem.

Requests
一直以来享有“以人为本”的美誉,然而发生在作者身上的这件事情,同时也让
Nathaniel
觉得“在互动中非常容易被操纵”,“我觉得他试图利用我,并试图让我同谋掩饰他的谎言以保护他的声誉。我对与此相关的想法感到非常不安,在他造成的这种情况下,我唯一的其它选择就是要么完全放弃异步工作,要么全身心地公开,这对我自己造成潜在的严重损失。”

最终,为了自己与 Python 社区,Nathaniel
决定把事情公开。他呼吁 Kenneth 对他筹集的资金以及如何使用进行公示,敦促
Requests 项目维护者将他们的项目转换为更正常、功能更少的管理模型。

原文:

  • https://vorpus.org/blog/why-im-not-collaborating-with-kenneth-reitz

(文/开源中国)