Python requests模块Session对象使用详解
本文详解Python requests库中Session对象的使用。通过创建Session实例,可实现HTTP请求间的状态保持,自动传递Cookie。同时,Session支持配置全局缺省参数(如Headers),并允许在单次请求中覆盖或添加临时参数,从而灵活处理跨请求与独立请求的参数差异。
Session对象与状态保持基础
HTTP协议本身是无状态的,这意味着默认情况下服务器无法识别连续请求是否来自同一用户。为了在请求之间维持状态信息,引入了Session和Cookie机制。Python的requests库提供了相应的功能来操作这些机制。
requests库中的Session对象允许我们在多个HTTP请求中保持特定的参数。这意味着,使用同一个Session对象发起的后续请求,可以自动携带之前设置的特定参数。最常见的应用场景是,Session能够确保Cookie在一系列连续请求中保持一致,无需手动重复设置。
接下来,我们将通过官方文档提供的示例代码,具体演示Session对象的使用方法。
Session保持Cookie的示例
import requests
s = requests.Session()
# 第一步:发送一个请求,用于设置请求中的cookies
# tips: http://httpbin.org能够用于测试http请求和响应
s.get('http://httpbin.org/cookies/set/sessioncookie/123456789')
# 第二步:再发送一个请求,用于查看当前请求中的cookies
r = s.get("http://httpbin.org/cookies")
print(r.text)
查看运行结果
{
"cookies": {
"sessioncookie": "123456789"
}
}
从输出结果可以看出,第二次请求成功携带了第一次请求中设置的Cookie,这证明了Session对象确实实现了Cookie的持久化保持。在示例中,我们首先创建了一个requests.Session()实例,并利用该实例执行HTTP请求。其基本用法与requests.request()函数类似,但具备状态保持能力。
由于Session使得请求之间具有连贯性,因此区分跨请求参数和非跨请求参数变得重要。有时我们需要让所有通过该Session发出的请求都携带某个固定参数,而有时又希望仅对某一条特定请求添加临时参数。下面的示例将展示如何区分和处理这两种情况。
跨请求参数与局部参数的配置
import requests
s = requests.Session()
s.headers.update({'x-test': 'true'})
# both 'x-test' and 'x-test2' are sent
r1 = s.get('http://httpbin.org/headers', headers={'x-test2': 'true'})
print(r1.text)
# 'x-test' is sent
r2 = s.get('http://httpbin.org/headers')
print(r2.text)
查看运行结果
# r1.text
{
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.22.0",
"X-Amzn-Trace-Id": "Root=1-5e91656f-b99f14a4d6f47f9e55a90bb4",
"X-Test": "true",
"X-Test2": "true"
}
}
# r2.text
{
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.22.0",
"X-Amzn-Trace-Id": "Root=1-5e91656f-e9741db4c2ca2fd6e0628396",
"X-Test": "true"
}
}
根据运行结果,我们可以总结出以下两点关键结论:
首先,Session可以为请求方法提供缺省数据。例如,在第一次请求中设置的{'x-test': 'true'}即为缺省数据,这类数据属于跨请求参数,会自动应用到后续所有通过该Session发起的请求中。其次,方法级别的参数不会被跨请求保持。例如,在第二次请求时,如果未显式携带headers={'x-test2': 'true'},返回结果中也不会出现{'x-test2': 'true'},这说明该参数仅在当前请求有效,并未被Session持久化保存。
参考资料
https://github.com/psf/requests/blob/master/requests/sessions.py
https://requests.readthedocs.io/en/master/user/advanced/#session-objects
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













