我需要使用“请求”和urllib3
中的函数。在代码中
您可以看到requests
库正在被导入,但同时它是urllib3
中的模块/包,它也已经被导入。
做一些研究,我发现Python带有urllib
软件包,而request
模块也有。另一方面,requests
是urllib3
内部的一个模块,但它本身是一个库。
urllib
和urllib2
是标准的Python库,但urllib3
是一个完全分离的库,名称混乱。它的一部分已包含在标准库中,requests
依赖于它,但是它不是urllib
/ urllib2
的较新版本;实际上要改进的库是httplib
(参考:Github)。
”“在后台, requests 使用 urllib3 来完成大部分http繁重的工作。如果使用得当,除非您不注意,否则大部分内容应该相同需要更高级的配置”(参考:Stackexchange):
我得出了这些结论,但我仍然感到困惑:如果我已经导入了urllib
,是否还需要导入requests
?如果我导入了urllib3
怎么办?
还有,requests
应该如所示的代码那样单独导入,还是应该从上述库之一导入?
答案 0 :(得分:3)
如果您使用的是requests
模块,那么这就是您唯一需要导入的内容。其余的工作由Python负责。 urllib3
使用的requests
是实施细节,除非您需要访问urllib3
库定义的特定对象,否则无需导入该对象进入您的代码库。
requests
是urllib3
内的一个模块,不是。 urllib3
模块定义了一个urllib3.request
模块(单数!),它与requests
软件包完全不同:
>>> import urllib3
>>> import requests
>>> urllib3.request
<module 'urllib3.request' from '/Users/mj/Development/venvs/stackoverflow-latest/lib/python3.7/site-packages/urllib3/request.py'>
>>> requests
<module 'requests' from '/Users/mj/Development/venvs/stackoverflow-latest/lib/python3.7/site-packages/requests/__init__.py'>
>>> requests is urllib3.request
False
请注意,urllib3.request
是urllib3
包 namespace 中的一个模块。 import request
(否s
)将不会导入它,因为这需要顶级名称。 import somethingelse.request
都不会,因为这将是与urllib3
不同的名称空间。仅仅因为名称requests
和request
相似并不意味着它们是同一回事。 HTTP标准处理发送到服务器的请求的抽象概念,并且服务器返回 response ,因此处理HTTP的不同项目中的名称通常会反映该概念。它们以代码表示。
名称urllib
和urllib2
的用法相同。以前,Python始于受限制的urllib
程序包,后来又添加了urllib2
程序包,从而扩展了第一个功能并添加了更多功能。 Python 3合并了这两个软件包,并将功能重组为series of new modules under the urllib
namespace。 urllib3
软件包是independent project,用于为相同的功能构建更好的库。该项目的任何部分都没有合并到Python标准库中。
requests
是一个项目,可为您提供干净,直接,易于使用的API,以发出HTTP请求并处理结果响应。将其用于该API,不必担心实现细节。