如果我们已经导入了 urllib 和 urllib3,是否还需要导入 requests lib 才能使用 requests? - urllibx,请求混淆

Do we need to import the requests lib to use requests if we have already imported urllib and urllib3? - urllibx, request confusion

我需要使用 'requests' 和 urllib3 中的函数。在代码中

你可以看到正在导入 requests 库,但同时它是 urllib3 中的 module/package,它也已经被导入了。

做一些研究我发现 Python 与 urllib 包一起提供,与 request 模块一起提供。另一方面,requestsurllib3 中的一个模块,但它本身就是一个库。

urlliburllib2 是标准的 Python 库,但 urllib3 是一个完全独立的库,名称令人困惑。它的一部分已经包含在标准库中并且 requests 依赖它,但它不是 urllib/urllib2 的更新版本;真正想要改进的库是 httplib (ref: Github).

"Under the hood, requests uses urllib3 to do most of the http heavy lifting. When used properly, it should be mostly the same unless you need more advanced configuration"
(ref: ):

我得出了这些结论,但我仍然很困惑:如果我已经导入了 urllib,我还需要导入 requests 吗?如果我导入了 urllib3 怎么办?

此外,requests 应该像描述的代码那样单独导入,还是应该从上述库之一导入?

如果您使用的是 requests 模块,那么这是您唯一需要导入的东西。 Python 为您处理剩下的事情。 requests 使用的 urllib3 是一个 实现细节 ,除非您需要访问不需要的 urllib3 库定义的特定对象将其导入您的代码库。

requests 不是 urllib3 中的模块。 urllib3 模块定义了一个 urllib3.request(单数!)模块,它与 requests 包完全不同:

>>> import urllib3
>>> import requests
>>> urllib3.request
<module 'urllib3.request' from '/Users/mj/Development/venvs/Whosebug-latest/lib/python3.7/site-packages/urllib3/request.py'>
>>> requests
<module 'requests' from '/Users/mj/Development/venvs/Whosebug-latest/lib/python3.7/site-packages/requests/__init__.py'>
>>> requests is urllib3.request
False

请注意 urllib3.requesturllib3 命名空间 中的一个模块。 import request(没有 s)不会导入它,因为它需要一个顶级名称。 import somethingelse.request 也不会,因为那将是与 urllib3 不同的名称空间。仅仅因为名称 requestsrequest 相似并不意味着它们是同一件事。 HTTP 标准处理 request 发送到服务器和服务器返回 response 的抽象概念,因此不同项目中的名称处理HTTP 通常会在代码中反映它们所代表的概念。

名称urlliburllib2也是如此。 Python,曾几何时,从一个受限制的 urllib 包开始,后来添加了一个 urllib2 包,扩展了第一个包并添加了更多功能。 Python 3 合并了两个包并将功能重新组织到一个 series of new modules under the urllib namespace. The urllib3 package is an independent project 中,以便为相同的功能构建更好的库。该项目的任何部分都没有纳入 Python 标准库。

requests 是一个为您提供干净、直接、易于使用的项目 API 来发出 HTTP 请求并处理结果响应。用它来 API,不用担心实现细节。