第 6 章 · Session 与持久连接
本章目标:掌握 Session 对象的使用,理解连接池、Cookie 持久化和 SSL 配置。
6.1 Session 对象基础
Session 对象可以跨请求保持 Cookie、连接池和配置:
python
import requests
# 创建 Session
session = requests.Session()
# 设置默认参数
session.headers.update({
'User-Agent': 'MyApp/1.0',
'Accept': 'application/json'
})
session.params = {'api_version': 'v2'}
# 所有请求复用配置
resp1 = session.get('https://api.example.com/user')
resp2 = session.get('https://api.example.com/posts')
resp3 = session.post('https://api.example.com/login', json={'user': 'admin'})
# 自动保持 Cookie
session.get('https://httpbin.org/cookies/set/session/cookie123')
resp = session.get('https://httpbin.org/cookies')
print(resp.json()['cookies']) # {'session': 'cookie123'}
# 使用完毕关闭
session.close()6.2 连接池与性能
Session 内部维护 TCP 连接池,复用连接可显著提升性能:
python
import requests
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry
# 创建 Session
session = requests.Session()
# 配置重试策略
retry = Retry(
total=3, # 最大重试次数
backoff_factor=1, # 重试间隔:0s, 1s, 2s...
status_forcelist=[429, 500, 502, 503, 504] # 需要重试的状态码
)
# 配置连接池
adapter = HTTPAdapter(
max_retries=retry,
pool_connections=10, # 连接池大小
pool_maxsize=10
)
# 挂载到 Session
session.mount('https://', adapter)
session.mount('http://', adapter)
# 现在所有请求都使用配置好的适配器
resp = session.get('https://httpbin.org/get')6.3 SSL/TLS 配置
python
import requests
# 验证 SSL 证书(默认开启)
resp = requests.get('https://httpbin.org/get', verify=True)
# 禁用 SSL 验证(仅调试用,生产环境不建议)
resp = requests.get('https://self-signed.badssl.com/', verify=False)
# 使用自定义 CA 证书
resp = requests.get('https://example.com', verify='/path/to/ca-bundle.crt')
# httpx 等效
import httpx
client = httpx.Client(verify=False) # 不验证证书
client = httpx.Client(verify='/path/to/ca.pem') # 自定义 CA6.4 Proxy 配置
python
import requests
# 全局代理
proxies = {
'http': 'http://proxy.example.com:8080',
'https': 'http://proxy.example.com:8080'
}
resp = requests.get('https://example.com', proxies=proxies)
# 指定域名不使用代理
no_proxy = 'localhost,127.0.0.1'
resp = requests.get('https://example.com', proxies=proxies, verify=True)
# Session 级别代理配置
session = requests.Session()
session.proxies = proxies
session.trust_env = False # 禁用环境变量代理6.5 完整 Session 配置示例
python
import requests
def create_session():
session = requests.Session()
# 默认头
session.headers.update({
'User-Agent': 'PythonHTTPCourse/1.0',
'Accept': 'application/json'
})
# 默认超时
session.timeout = 30
# 重试配置
retry = Retry(total=3, backoff_factor=0.5)
adapter = HTTPAdapter(max_retries=retry)
session.mount('https://', adapter)
session.mount('http://', adapter)
return session
# 使用
session = create_session()
try:
resp = session.get('https://api.github.com/user')
print(resp.json()['login'])
finally:
session.close()6.6 本章小结
- Session 对象跨请求保持 Cookie、头和配置;
- 连接池和重试策略可提升性能和可靠性;
- SSL 验证默认开启,生产环境不要随意关闭;
- Proxy 配置支持全局和 per-request 两种方式。
🧪 随堂测验
点击你认为正确的选项。答错时会展示正确答案与原因解析。
1. Session 对象相比普通请求的主要优势是?
2. HTTPAdapter 的 max_retries 参数用于?
3. verify=False 的作用是?
4. session.trust_env = False 的效果是?
🛠️ 动手实践
- 创建 Session 对象,依次访问 httpbin 设置 Cookie 并验证 Cookie 是否保持。
- 配置重试策略:对 5xx 状态码自动重试 3 次,观察效果。
- 使用自定义 CA 证书访问 HTTPS 站点(可用 self-signed.badssl.com 测试)。