python__requests模块的session对象

发布时间 2023-10-28 18:52:47作者: 娜娜99

*****************************************************************************************************************************************************************************************************************

面试时,面试官问我:自动化中,只需要登录一次,就可以跑其他的自动化用例。这个用什么方法。

目前公司项目自动化中实现方式:调登录接口并传入登录用户名和加密的密码来获取响应数据中的token值。后续的自动化用例再去调接口的话,就只需要在请求头中把获取到的token值携带上,就可以调接口成功;

但貌似这种方式并不是面试官想得到的答案。于是上网查资料,发现requests库中的 session对象,是此题的答案。于是本次学习和记录一下 requests中的session对象。

**************************************************************************************************************************************************************************************************************************************************

1、先看一个别人写的博客(博客地址:https://www.jianshu.com/p/adc2f76530d1)

requests

使用上其实很简单,可以直接通过 request.get() 的方式去操作。但如果对需要处理的对象发送请求比较频繁,或者需要登录。使用requests.session() 来操作其实更方便高效。

下面进行抓包测试。
*客户端ip 192.168.224.1
*服务端ip 192.168.224.133
192.168.224.133:30000 为测试环境搭建tornado服务,照着tornado官网的例子写的。

客户端代码如下

import requests

def use_each():
    # 两次调用get请求
    resp = requests.get(url='http://192.168.224.133:30000/test')
    print(resp.json())
    resp = requests.get(url='http://192.168.224.133:30000/test')
    print(resp.json())

if '__main__' == __name__:
    use_each()

可以看到两次get请求,抓包结果分别建立了两次TCP握手,两次挥手。客户端每次挥手势必都会等待2MSL后才彻底断开连接。

重新调整代码为session方式

import requests

def use_session():
    _session = requests.session()
    resp = _session.get(url='http://192.168.224.133:30000/test')
    print(resp.json())
    resp = _session.get(url='http://192.168.224.133:30000/test')
    print(resp.json())

if '__main__' == __name__:
    use_session()

两次get请求只建立了一个tcp通信信道,对同一个后端服务进行请求上明显效率更高。

查看源码可以看到requests会尝试去获取了一个poolmanager。

持有当前连接对象后再通过socket发送数据。

 2、session对象学习

2.1、从上述的博客中,大概看到两个重点信息:(1)通过创建的session对象来调接口进行请求,相对是在客户端和终端建立一个通道,后续的各请求都是走此通道(而像目前公司自动化项目的实现方式,相当的于每次调接口,都建立一次连接),session的这种方式能够提高执行的效率、减少了连接的资源。(2)requests会尝试去获取了一个poolmanager

 

2.2、那通过登录接口返回的token值,来调其他的接口这种方式,和 session对象调接口的方式有什么不同呢?

 

2.3、 另外,如果登录接口中,用户名的密码是加密的,那需要先将密码加密,再使用session 对象来调登录接口

 

2.4、sesion 方式调用接口时,需要根据不同接口的请求头参数不同,来传递不同的请求头参数

 

2.5、实际操作。。。。。。。。。。。。。。。。。。。。。。