Skip to content

Requests - 处理会话

requests 库中的 Session 对象允许您在多个请求之间保持某些参数持久化。这对于以下情况特别有用:

  • Cookie 持久化: 服务器设置的 Cookie 会自动存储在 session 中,并在后续对同一域名的请求中发送。
  • 连接池: 当向同一主机发出多个请求时,session 会重用底层的 TCP 连接,这可以显著提高性能。
  • 默认配置: 为通过该 session 发出的所有请求设置默认的请求头 (headers)、认证 (authentication) 或查询参数 (query parameters)。

如果您向同一主机发出多个请求,使用 Session 对象将确保 Cookie 得到正确处理,就像网络浏览器一样。

import requests
# 创建一个 Session 对象
session = requests.Session()
# 发出一个设置 Cookie 的请求 (httpbin.org/cookies/set?name=value)
# 此端点将重定向到 /cookies,显示已设置的 Cookie。
print("Setting a cookie using a session...")
response1 = session.get('https://httpbin.org/cookies/set/sessioncookie/123456789')
print("Cookies after setting (from redirect to /cookies):")
print(response1.json())
# 使用同一 session 向同一域名发出另一个请求
# 'sessioncookie' 应该会自动发送。
print("\nRequesting /cookies again to check persistence:")
response2 = session.get('https://httpbin.org/cookies')
print(response2.json())
Setting a cookie using a session...
Cookies after setting (from redirect to /cookies):
{'cookies': {'sessioncookie': '123456789'}}
Requesting /cookies again to check persistence:
{'cookies': {'sessioncookie': '124356789'}}

如您所见,在第一次请求中设置的 sessioncookie 在对 httpbin.org/cookies 的第二次请求中自动发送了。

您可以为 Session 对象设置默认的请求头。这些请求头将包含在该 session 发出的所有请求中。在请求方法中直接提供的请求头(例如,session.get(url, headers=...))将与 session 的请求头合并,方法特定的请求头对于相同的键具有更高的优先级。

import requests
# 创建一个 Session 对象
session = requests.Session()
# 更新 session 的默认请求头
session.headers.update({
'x-custom-session-header': 'DefaultValue',
'User-Agent': 'MyCustomApp/1.0'
})
print("Request with session default headers:")
response1 = session.get('https://httpbin.org/headers')
print(response1.json()['headers'])
print("\nRequest with session headers and method-specific headers (overriding User-Agent):")
# 方法特定的请求头可以覆盖或添加到 session 请求头
custom_request_headers = {
'x-custom-request-header': 'SpecificValue',
'User-Agent': 'MyCustomApp/2.0-Override'
}
response2 = session.get('https://httpbin.org/headers', headers=custom_request_headers)
print(response2.json()['headers'])

预期输出(已简化,实际顺序可能有所不同)

Section titled “预期输出(已简化,实际顺序可能有所不同)”
Request with session default headers:
{
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Host": "httpbin.org",
"User-Agent": "MyCustomApp/1.0",
"X-Amzn-Trace-Id": "Root=...",
"X-Custom-Session-Header": "DefaultValue"
}
Request with session headers and method-specific headers (overriding User-Agent):
{
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Host": "httpbin.org",
"User-Agent": "MyCustomApp/2.0-Override",
"X-Amzn-Trace-Id": "Root=...",
"X-Custom-Request-Header": "SpecificValue",
"X-Custom-Session-Header": "DefaultValue"
}

在使用 API 进行交互时,特别是当您需要进行多次调用或处理依赖 Cookie 的认证时,使用 Session 对象是一个最佳实践。从session 对象官方文档了解更多信息。