BaseAdapter 类则是该库中用于处理请求和响应的适配器的基类。
用户可以继承该类并自定义自己的方法来覆写它。
close() 方法主要用于清理或完成适配器相关的操作。
当一个 Session 对象被关闭或超出范围时,会自动调用已挂载适配器的 close() 方法。
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 类的作用在于提供了一个灵活的机制,允许用户创建和使用自己的传输适配器,实现自己需要的特殊功能,让用户能够更好地控制和管理 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)
用于向 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)
该方法的主要作用是将请求和响应对象合并为一个完整的 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()
验证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)
用于关闭适配器的方法。
处理任何内部状态。
目前,这会关闭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()
用于获取连接对象。
返回给定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())
用于初始化和配置连接池管理器。
初始化urllib3 PoolManager。
此方法不应该从用户代码中调用,并且仅在对HTTPAdapter进行子类化时才公开使用。
参数:
connections -- 指定urllib3连接池中的最大连接数。
maxsize -- 指定每个主机的最大连接数。
block -- 如果设置为 True,当连接池达到最大容量时,新的请求会被阻塞,直到有连接可用。如果设置为 False,则会立即引发异常,默认值为 False。
pool_kwargs -- 允许传递其他关键字参数以配置连接池的其他设置。这些参数将传递给底层的连接池实现。
用于生成代理请求所需的头部信息。
返回要添加到通过代理发送的任何请求头的字典。这与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)
返回给定代理的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)
获取要在发出最后请求时使用的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)
是 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 的特定方法。
requests.codes 包含了常见的HTTP状态码及其对应的原因短语。
与HTTP状态码相同。参考:
百度安全验证
HTTP状态码大全_http 状态码大全-CSDN博客
例:
import requests
print(requests.codes['ok']) # 输出:200
更多详情参见官方文档:开发接口 — Requests 2.18.1 文档