一、作用:
在使用Python做接口自动化测试过程中,我们会调用多个接口发出多个请求,在这些请求中有时候需要保持一些共用的数据,例如cookies信息。
另外,大部分接口调用往往需要先进行登录操作,然后才能对相关的接口进行操作。
针对以上情形,通常我们会有两种做法
1、每次接口请求后获取到响应中的cookie,然后接下来的所有请求带上这个cookie
2、使用requests的session会话对象
今天分享一下使用requests的session会话对象,保持登录状态,然后对接口进行操作的场景。
二、requests.session用法
1、基本用法
s = requests.session() 会实例化会话一个会话对象
1、会话对象让你能够跨请求保持某些参数。它也会在同一个 Session 实例发出的所有请求之间保持 cookie
2、会话对象具有主要的 Requests API 的所有方法。你可以当成 Request去使用
import requests
s = requests.session() # 实例化会话对象
loginUrl = "https://q.test.dos.lixinchuxing.cn/auth/wxlogin"
data = {"username": "********", "password": "******"}
header = {"Content-Type": "application/json; charset=UTF-8"}
try:
#进行登录
res = s.post(url=loginUrl,json=data,headers=header, verify=False)
except Exception as e:
print("登录异常".format(e))
#下面为需要共享cookie的请求,put或者get请求用s.put和s.post来进行发起,就会自动带上共享的cookie
testurl = "https://XXXXXXXXX"
testdata = {}
res_test = s.get(url=testurl,data=data)
res_test2 = s.post(url=testurl,data=data)
2、通过设置session对象的属性来实现自定义请求方法的缺省数据
我们在测试中也会遇到这样一种情况,除了cookie之外,在请求时需要在header中加入额外的验证,这时我们可以用s.headers.update()方法,将其余请求方法中的headers属性合并起来作为最终的请求方法的headers
import requests
s = requests.session() # 实例化会话对象
loginUrl = "https://q.XXX.dos.lixinchuxing.cn/XXXX/wxlogin"
data = {"username": "********", "password": "******"}
header = {"Content-Type": "application/json; charset=UTF-8"}
try:
#进行登录
res = s.post(url=loginUrl,json=data,headers=header, verify=False)
#将X-CSRF-Token属性添加至session的header中,此后的请求请求头中会带上此属性
s.headers.update = ({"X-CSRF-Token":token})
except Exception as e:
print("登录异常".format(e))
三、完整代码
import requests
requests.packages.urllib3.disable_warnings() #忽略警告
def login():
s = requests.session() # 实例化会话对象
loginUrl = "https://q.XXX.dos.lixinchuxing.cn/XXXX/wxlogin"
data = {"username": "********", "password": "******"}
header = {"Content-Type": "application/json; charset=UTF-8"}
try:
res = s.post(
url=loginUrl,
json=data,
headers=header, verify=False)
print(res.cookies)
# 后续接口请求在header中要增加"X-CSRF-Token"属性,值为登录请求获取到的csrf-token值
token = res.cookies["csrf-token"]
s.headers.update = ({"X-CSRF-Token":token})
#返回登录处理后的session对象
return s
except Exception as e:
print("登录异常".format(e))
# 第二次请求的url
Url2 = 'https://q.test.dos.lixinchuxing.cn/api/v1/****/****/*****/evaluation/car_info'
data={"is_from_car_manage": "false"}
# 请求接口
Res2 = login().put(url=Url2,dat=data)
print(Res2.text)
经验证,可以正常向需要首先登陆的接口发送请求