1. 架构
Session对象在内部使用一个TCP连接池,用于管理TCP连接。当你创建一个Session对象时,它会自动为你创建一个连接池。当你使用Session对象发送请求时,它会从连接池中获取一个可用的连接,然后使用这个连接发送请求。如果连接池中没有可用的连接,Session对象会自动创建一个新的连接。当请求完成后,Session对象会将连接放回连接池,以供后续请求使用。
2. 核心内容
- 会话对象(Session):
Session
对象能够跨请求保持某些参数。它会存储cookies,直到会话结束,允许你在同一Session实例发出的所有请求之间保持这些cookies。 - 持久连接:
Session
对象还支持持久连接。这意味着在多次请求之间,底层的TCP连接可以被重用,这可以显著提高性能。 - 请求方法:
Session
对象提供了与requests
模块相同的方法,如get()
,post()
,put()
,delete()
等,可以用来发送请求。 - 配置共享:在整个会话期间,设置一次参数(如认证信息、超时时间等)就可以应用于所有通过该 Session 发送的请求。
- 适配器支持: 可以给 Session 添加自定义适配器来定制网络行为,例如重试策略。
3. 代码案例
当然,让我们继续补充一些关于requests
库中Session
对象的案例。
案例1: 模拟登录并保持会话
在这个案例中,我们将使用Session
对象来模拟一个登录过程,并保持会话以访问需要认证的页面。
import requests
# 创建一个Session对象
session = requests.Session()
# 登录URL和登录数据
login_url = 'https://example.com/login'
login_data = {
'username': 'your_username',
'password': 'your_password'
}
# 使用Session对象发送POST请求进行登录
response = session.post(login_url, data=login_data)
# 现在可以使用Session对象访问需要认证的页面
protected_url = 'https://example.com/protected'
response = session.get(protected_url)
print(response.text)
在这个例子中,我们首先发送一个POST请求到登录URL,然后使用相同的Session
对象访问一个需要认证的页面。由于Session
对象会自动处理cookies,所以我们可以直接访问受保护的页面而不需要再次登录。
案例2: 使用Session对象发送带有自定义头的请求
有时,我们可能需要发送带有自定义HTTP头的请求。使用Session
对象,我们可以为所有通过该对象发送的请求设置默认的头部信息。
import requests
# 创建一个Session对象
session = requests.Session()
# 设置默认的HTTP头
session.headers.update({
'User-Agent': 'my-app/0.0.1',
'Authorization': 'Bearer YOUR_ACCESS_TOKEN'
})
# 使用Session对象发送GET请求,请求会包含我们设置的自定义头
response = session.get('https://example.com/data')
print(response.text)
在这个例子中,我们通过session.headers.update()
方法为所有通过session
对象发送的请求设置了自定义的HTTP头。这样,我们就不需要在每个请求中单独设置这些头部信息。
案例3: 使用Session对象处理Cookies
Session
对象会自动处理cookies,包括发送和接收。我们可以通过Session
对象的cookies
属性来查看和操作cookies。
import requests
# 创建一个Session对象
session = requests.Session()
# 发送一个请求,这个请求会设置一个cookie
response = session.get('https://httpbin.org/cookies/set/sessioncookie/123456789')
# 查看Session对象中的cookies
print(session.cookies)
# 发送另一个请求,这个请求会使用之前设置的cookie
response = session.get('https://httpbin.org/cookies')
print(response.text)
在这个例子中,我们首先发送一个请求来设置一个cookie,然后通过session.cookies
属性查看所有已设置的cookies。当我们发送后续请求时,Session
对象会自动附带上次请求设置的cookie。
请注意,实际使用时,您需要将示例中的URL替换为真实的登录页面和受保护页面的URL,并提供正确的登录凭据。这些示例仅用于演示如何使用requests
库中的Session
对象。