第三章:深入 Requests——Session、连接池与 HTTP 工作机制
【摘要】 当我们掌握基本 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)