第三章:深入 Requests——Session、连接池与 HTTP 工作机制

举报
yd_220371319 发表于 2026/09/05 12:11:00 2026/09/05
【摘要】 当我们掌握基本 API 后,就会发现 Requests 真正有价值的地方并不只是:requests.get()它内部还涉及 Session、连接池、Cookie 等机制。1. 为什么需要 Session?假设我们连续访问同一个服务器:requests.get(url1)requests.get(url2)requests.get(url3)如果每次请求都重新建立连接,会产生额外开销。这时候可...


当我们掌握基本 API 后,就会发现 Requests 真正有价值的地方并不只是:


requests.get()

它内部还涉及 Session、连接池、Cookie 等机制。

1. 为什么需要 Session?

假设我们连续访问同一个服务器:


requests.get(url1)
requests.get(url2)
requests.get(url3)

如果每次请求都重新建立连接,会产生额外开销。

这时候可以使用:


session = requests.Session()

然后:


session.get(url1)
session.get(url2)
session.get(url3)


2. Session 的另一个作用:保存 Cookie

例如:


session = requests.Session()

session.post(
    "https://example.com/login",
    data={
        "username": "admin",
        "password": "password"
    }
)

response = session.get(
    "https://example.com/profile"
)

登录请求产生的 Cookie 可以由 Session 自动维护。

因此后续请求可以继续保持登录状态。


3. Session 统一设置 Headers

例如:


session = requests.Session()

session.headers.update({
    "User-Agent": "MyClient/1.0",
    "Accept": "application/json"
})

之后:


session.get(url)

都会自动携带这些请求头。


4. HTTPAdapter

Requests 底层使用 urllib3 处理连接相关工作。

通过 Adapter,我们可以进一步控制连接池。

例如:


from requests.adapters import HTTPAdapter

session = requests.Session()

adapter = HTTPAdapter(
    pool_connections=10,
    pool_maxsize=20
)

session.mount(
    "https://",
    adapter
)

这在需要大量请求的程序中非常有价值。


5. Retry 重试机制

网络环境并不可靠。

请求可能因为:

  • DNS 故障
  • TCP 连接失败
  • 临时服务器错误
  • 网络抖动

而失败。

可以配合 urllib3 的 Retry:


from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry

retry = Retry(
    total=3,
    backoff_factor=1,
    status_forcelist=[500, 502, 503, 504]
)

adapter = HTTPAdapter(
    max_retries=retry
)

session = requests.Session()

session.mount(
    "https://",
    adapter
)

这样就可以实现基础的自动重试。


6. Requests 的调用链

从使用角度来看:


requests.get()
      ↓
requests.request()
      ↓
Session.request()
      ↓
PreparedRequest
      ↓
HTTPAdapter
      ↓
urllib3
      ↓
HTTP / HTTPS

这也是理解 Requests 源码非常重要的一条主线。

下一章,我们不再停留在 API 层,而是通过一个完整项目看看 Requests 如何应用到实际开发中。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。