Skip to content

第 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')  # 自定义 CA

6.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 的效果是?

🛠️ 动手实践

  1. 创建 Session 对象,依次访问 httpbin 设置 Cookie 并验证 Cookie 是否保持。
  2. 配置重试策略:对 5xx 状态码自动重试 3 次,观察效果。
  3. 使用自定义 CA 证书访问 HTTPS 站点(可用 self-signed.badssl.com 测试)。