Python第三方requests库adapters类详解(6/6)

requests.adapters.BaseAdapter类

BaseAdapter 类则是该库中用于处理请求和响应的适配器的基类。

用户可以继承该类并自定义自己的方法来覆写它。

1、close()

close() 方法主要用于清理或完成适配器相关的操作。

当一个 Session 对象被关闭或超出范围时,会自动调用已挂载适配器的 close() 方法。

2、send(request, stream=False, timeout=None, verify=True, cert=None, proxies=None)

send() 方法负责实际发送请求,并返回相应的响应对象。

可以根据需要在自定义适配器中覆盖该方法,以实现特定的请求发送逻辑。

参数:

request:PreparedRequest对象

stream: 如果为 True,则返回响应的内容不会立即下载。默认为 False。

timeout: 请求的超时时间,可以是一个数字或一个包含两个元素的元组(连接超时和读取超时)。

verify: 是否进行 SSL 证书验证。默认为 True。

cert: 客户端证书文件路径。可以是单个文件(包括密钥和证书)或包含两个文件路径的元组。

proxies: 代理配置。

示例:

from requests.adapters import BaseAdapter

class MyCustomAdapter(BaseAdapter):

    def send(self, request, stream=False, timeout=None, verify=True, cert=None, proxies=None):

        # 实现自定义的请求发送逻辑

        # ...

# 使用自定义适配器的会话:

import requests

session = requests.Session()

session.mount('http://', MyCustomAdapter())

session.mount('https://', MyCustomAdapter())

# 发送请求

response = session.get('https://example.com')

# 处理响应

print(response.text)

# 注意:上述示例中的 MyCustomAdapter 类需要根据具体需求实现自定义的请求发送逻辑。

requests.adapters.HTTPAdapter(pool_connections=10, pool_maxsize=10, max_retries=0, pool_block=False)

requests.adapters.HTTPAdapter 类的作用在于提供了一个灵活的机制,允许用户创建和使用自己的传输适配器,实现自己需要的特殊功能,让用户能够更好地控制和管理 HTTP 和 HTTPS 请求的发送,并能够实现一些特殊的交互功能。

urllib3的内置HTTP适配器。

通过实现传输适配器接口,为请求会话提供通用情况接口,以联系HTTP和HTTPS url。这个类通常由Session类在后台创建。

参数:

- pool_connections: 连接池的最大连接数。

- pool_maxsize: 每个主机的最大连接数。

- max_retries: 最大重试次数,设置为 0 表示禁用重试。

- pool_block: 如果连接池达到最大大小并且所有连接都在使用,则是否阻塞请求。默认为 False。

用法:

>>> import requests

>>> s = requests.Session()

>>> a = requests.adapters.HTTPAdapter(max_retries=3)

>>> s.mount('http://', a)

1、add_headers(request, **kwargs)

用于向 HTTP 请求中添加自定义头部信息的函数。

添加任何连接需要的头部信息。从v2.0开始,默认情况下这不会做任何事情,但用户可以通过子类化HTTPAdapter来覆盖它。

不应从用户代码中调用此方法,只有在子类化HTTPAdapter时才暴露出来。

参数

request:一个 requests.Request 对象,表示要发送的 HTTP 请求。

**kwargs:一个可变关键字参数字典,其中包含要添加到请求头部的信息。

示例:

import requests

# 创建一个 HTTPAdapter 对象

adapter = requests.adapters.HTTPAdapter()

# 创建一个 Request 对象

url = 'https://example.com'

headers = {'User-Agent': 'Mozilla/5.0', 'Authorization': 'Bearer YOUR_TOKEN'}

request = requests.Request('GET', url, headers=headers)

# 将自定义头部信息添加到请求中

adapter.add_headers(request, User='CustomUser', CustomHeader='CustomValue')

# 发送带有自定义头部信息的 HTTP 请求

response = requests.Session().send(request.prepare())

# 打印响应内容

print(response.text)

 2、build_response(req, resp)

该方法的主要作用是将请求和响应对象合并为一个完整的 Response 对象,并对其进行一些处理,例如解析响应内容、设置响应头等。最后返回一个 Response 对象。

从urllib3响应构建一个Response对象。它不应该从用户代码中调用,并且只有在子类化HTTPAdapter时才会公开使用

参数

req -- 用于生成response的PreparedRequest对象.

resp -- urllib3的response对象

返回类型:requests.Response

示例:

import requests

import urllib3

# 创建一个 urllib3 的连接池

http = urllib3.PoolManager()

# 发送一个 HTTP GET 请求

url = 'https://www.example.com'

response = http.request('GET', url)

# 使用 HTTPResponse 类来创建响应对象

urllib3_response = urllib3.HTTPResponse(body=response.data, status=response.status, headers=response.headers)

# 使用 build_response 方法将其转化为 requests.Response 对象

req = requests.Request('GET', url).prepare()  # 创建一个准备就绪的请求对象

requests_response = requests.adapters.HTTPAdapter().build_response(req, urllib3_response)

# 打印状态码和响应内容

print(f"Status code: {requests_response.status_code}")

print(f"Response content: {requests_response.raw}")

# 最后别忘了关闭连接池

http.clear()

3、cert_verify(conn, url, verify, cert)

验证SSL证书。

此方法不应该从用户代码中调用,并且仅在对HTTPAdapter进行子类化时才公开使用。

参数:

- conn: urllib3连接对象。

- url: 请求的 URL。

- verify: 控制是否进行 SSL 证书验证。如果为 True,则验证证书;如果为 False,则禁用验证。

- cert: 客户端证书文件路径,可以是单个文件路径(包括密钥和证书)或包含两个文件路径的元组。

示例:

from requests.adapters import HTTPAdapter

import requests

class CustomAdapter(HTTPAdapter):

    def cert_verify(self, conn, url, verify, cert):

        # 自定义 SSL 证书验证逻辑

        # ...

# 使用自定义适配器的会话:

session = requests.Session()

session.mount('https://', CustomAdapter())

# 发送请求,其中 SSL 证书验证由自定义适配器的 cert_verify 方法处理

response = session.get('https://example.com', verify=True, cert='/path/to/client_certificate.pem')

# 处理响应

print(response.text)

4、close()

用于关闭适配器的方法。

处理任何内部状态。

目前,这会关闭PoolManager和任何活动的ProxyManager,从而关闭任何池连接。

例:

from requests.adapters import HTTPAdapter

import requests

class CustomAdapter(HTTPAdapter):

    def close(self):

        # 执行适配器相关的清理操作

        # ...

# 使用自定义适配器的会话:

session = requests.Session()

session.mount('https://', CustomAdapter())

# 发送请求

# 当会话关闭或超出范围时,已挂载适配器的 close() 方法会被自动调用。

session.close()

5、get_connection(url, proxies=None)

用于获取连接对象。

返回给定URL的urllib3连接。

它不应该从用户代码中调用,并且只有在子类化HTTPAdapter时才会公开使用。

参数:

url -- 请求的URL

proxies -- (选填) 用于此请求的代理的Request类型字典

返回类型:urllib3.ConnectionPool

示例:

from requests.adapters import HTTPAdapter

import requests

class CustomAdapter(HTTPAdapter):

'''

CustomAdapter 类继承自 HTTPAdapter,并覆盖了 get_connection 方法,可以在这个方法中实现自定义的获取连接对象的逻辑。在使用自定义适配器的会话中,通过调用 get_connection 方法获取连接对象,然后使用连接对象发起请求。

'''

    def get_connection(self, url, proxies=None):

        # 自定义获取连接对象的逻辑

        # ...

# 使用自定义适配器的会话:

session = requests.Session()

session.mount('https://', CustomAdapter())

# 获取连接对象

connection = session.get_connection('https://example.com', proxies={'https': 'http://proxy.example.com:8080'})

# 使用连接对象发起请求

response = connection.urlopen('GET', '/path')

# 处理响应

print(response.read())

6、init_poolmanager(connections, maxsize, block=False, **pool_kwargs)

用于初始化和配置连接池管理器。

初始化urllib3 PoolManager。

此方法不应该从用户代码中调用,并且仅在对HTTPAdapter进行子类化时才公开使用。

参数:

connections -- 指定urllib3连接池中的最大连接数。

maxsize -- 指定每个主机的最大连接数。

block -- 如果设置为 True,当连接池达到最大容量时,新的请求会被阻塞,直到有连接可用。如果设置为 False,则会立即引发异常,默认值为 False。

pool_kwargs -- 允许传递其他关键字参数以配置连接池的其他设置。这些参数将传递给底层的连接池实现。

7、proxy_headers(proxy)

用于生成代理请求所需的头部信息。

返回要添加到通过代理发送的任何请求头的字典。这与urllib3魔术一起工作,以确保它们被正确地发送到代理,而不是在使用CONNECT时发送到隧道请求中。

它不应该从用户代码中调用,并且只有在子类化HTTPAdapter时才会公开使用。

参数:proxies -- 代理的 URL 地址,可以是字符串形式的代理 URL。

返回类型:dict

示例:

import requests

from requests.adapters import HTTPAdapter

# 创建一个HTTP适配器

adapter = HTTPAdapter()

# 代理地址

proxy_url = "http://your_proxy_server"

# 获取代理请求的头部信息

headers = adapter.proxy_headers(proxy_url)

# 输出头部信息

print(headers)

8、proxy_manager_for(proxy, **proxy_kwargs)

返回给定代理的urllib3 ProxyManager。

此方法不应该从用户代码中调用,并且仅在对HTTPAdapter进行子类化时才公开使用。

参数:

proxy -- The proxy to return a urllib3 ProxyManager for.

proxy_kwargs -- Extra keyword arguments used to configure the Proxy Manager.

返回:ProxyManager

返回类型:urllib3.ProxyManager

示例:

import requests

from requests.adapters import HTTPAdapter

from urllib3 import PoolManager

# 创建一个HTTP适配器

adapter = HTTPAdapter()

# 代理地址

proxy_url = "http://your_proxy_server"

# 获取代理管理器

proxy_manager = adapter.proxy_manager_for(proxy_url)

# 使用代理管理器发送请求

with requests.Session() as session:

    session.mount(proxy_url, proxy_manager)

    response = session.get("http://example.com")

# 输出响应内容

print(response.text)

9、request_url(request, proxies)

获取要在发出最后请求时使用的url。

如果消息是通过HTTP代理发送的,则必须使用完整的URL。否则,我们应该只使用URL的路径部分。

它不应该从用户代码中调用,并且只有在子类化HTTPAdapter时才会公开使用。

参数:request -- 要发送的PreparedRequest请求对象.

proxies --代理配置,可以是一个字典,指定了不同协议的代理。.

返回类型:str

示例:

import requests

from requests.adapters import HTTPAdapter

# 创建一个HTTP适配器

adapter = HTTPAdapter()

# 定义请求的URL

url = "http://example.com"

# 定义代理配置

proxies = {

    'http': 'http://your_http_proxy',

    'https': 'http://your_https_proxy',

}

# 创建请求对象

request = requests.Request('GET', url)

# 获取实际请求的URL,考虑代理配置

actual_url = adapter.request_url(request, proxies)

# 输出实际请求的URL

print("实际请求的URL:", actual_url)

10、send(request, stream=False, timeout=None, verify=True, cert=None, proxies=None)

是 requests 库中的一个核心方法,用于发送 HTTP 请求。

发送PreparedRequest请求对象. 返Response响应对象.

参数:

request: 要发送的PreparedRequest 请求对象。

stream: (选填)控制是否立即下载响应体。默认为 False,表示立即下载。

timeout: 设置请求超时时间,可以是一个数字,表示超时的秒数,或一个元组,分别表示连接和读取超时的秒数。

verify: 控制是否验证服务器的 SSL 证书。默认为 True,表示验证。

cert: 客户端证书文件路径,用于在请求时提供客户端证书。

proxies: 代理配置,可以是一个字典,指定了不同协议的代理。

返回类型:requests.Response

示例:

import requests

from requests.adapters import HTTPAdapter

# 创建一个HTTP适配器

adapter = HTTPAdapter()

# 定义请求的URL

url = "http://example.com"

# 创建请求对象

request = requests.Request('GET', url)

# 发送请求,并获取响应对象

response = adapter.send(request, stream=True, timeout=(5, 10), verify=True, proxies={'http': 'http://your_http_proxy'})

# 输出响应内容

print(response.text)

在上述示例中,我们首先导入了 requests 库和 HTTPAdapter 类。然后,创建了一个 HTTPAdapter 实例。接下来,定义了请求的URL url 和一个请求对象 request。最后,通过调用 adapter.send 方法,发送请求并获取响应对象 response。在示例中,我们设置了一些参数,如 stream、timeout、verify 和 proxies,以演示在发送请求时可以传递的一些常见参数。

这个方法是 requests 库的一部分,它是发送 HTTP 请求的核心方法之一,通常用户可以直接使用 requests 库的高级接口来发送请求,而不必手动调用 HTTPAdapter 的特定方法。

——其他类

身份验证相关类

Cookie相关类

requests.codes字典常量

requests.codes 包含了常见的HTTP状态码及其对应的原因短语。

与HTTP状态码相同。参考:

百度安全验证

HTTP状态码大全_http 状态码大全-CSDN博客

1xx 消息

2xx 成功

3xx 重定向

4xx 客户端错误

5xx 服务器错误

例:

import requests

print(requests.codes['ok']) # 输出:200

更多详情参见官方文档:开发接口 — Requests 2.18.1 文档

你可能感兴趣的:(python,开发语言)