• 0
  • 0
分享
  • Python Requests模块session的使用建议——软件测试
  • 橙子 2024-10-17 15:23:59 字数 3214 阅读 175 收藏 0

  本篇主要讲解Python Requests模块session的使用建议及整个会话中的所有cookie的方法。

  测试代码

  服务端:下面是用flask做的一个服务端,用来设置cookie以及打印请求时的请求头。

# -*- coding: utf-8 -*-
from flask import Flask, make_response, request
app = Flask(__name__)
@app.route('/a1')
def a1():
    print(request.headers)
    rp = make_response()
    rp.set_cookie('a1', '123')
    return rp
@app.route('/a2')
def a2():
    print(request.headers)
    rp = make_response()
    # rp.set_cookie('a2', '234')
    return rp
@app.route('/a3')
def a3():
    print(request.headers)
    rp = make_response()
    rp.set_cookie('a3', '345')
    return rp
if __name__ == '__main__':
    app.run(host='0.0.0.0')

  客户端:

# -*- coding: utf-8 -*-
import requests
url1 = 'http://192.168.2.159:5000/a1'
url2 = 'http://192.168.2.159:5000/a2'
url3 = 'http://192.168.2.159:5000/a3'
cookies = requests.utils.cookiejar_from_dict({'test': 'test'})
print(type(cookies), cookies)  # RequestsCookieJar 对象
s = requests.session()
s.cookies = cookies    # 这里设置的cookie test=test 是所有请求中都会附带的
s.headers = {'h1':'h1'} #  这里设置的请求头h1=h1是所有请求中都会附带的
r1 = s.get(url1, cookies={'r1': 'r1'},headers={'h2':'h2'})  # 临时加上cookie r1=r1 和 header h2=h2 下一个请求中不会有此 cookie  和header
r2 = s.get(url2)
requests.utils.add_dict_to_cookiejar(s.cookies, {'xx': 'xx'})  # 在接下来的请求中,永久添加xx cookie
r3 = s.get(url3)
# r1.cookies 是一个RequestsCookieJar对象,可以使用  requests.utils.dict_from_cookiejar(r1.cookies) 将其转换成dict
# 我发现可以直接用dict进行转换,这样写起来更方便  
print(dict(r1.cookies))  # 打印r1请求的返回结果中设置的cookies
print(dict(r2.cookies))  # 打印r2请求的返回结果中设置的cookies
print(dict(r3.cookies))  # 打印r3请求的返回结果中设置的cookies
print(dict(s.cookies))  # s.cookies中包含整个会话请求中的所有cookie(临时添加的如上面的r1不包含在内)

  先启动服务端,再启动客户端。

  运行结果

  服务端打印结果:

192.168.2.159 - - [26/Jun/2019 17:28:00] "GET /a1 HTTP/1.1" 200 -
Host: 192.168.2.159:5000
Accept-Encoding: identity
H1: h1
H2: h2
Cookie: test=test; r1=r1
192.168.2.159 - - [26/Jun/2019 17:28:00] "GET /a2 HTTP/1.1" 200 -
Host: 192.168.2.159:5000
Accept-Encoding: identity
H1: h1
Cookie: test=test; a1=123
192.168.2.159 - - [26/Jun/2019 17:28:00] "GET /a3 HTTP/1.1" 200 -
Host: 192.168.2.159:5000
Accept-Encoding: identity
H1: h1
Cookie: test=test; xx=xx; a1=123

  客户端打印结果:

<class 'requests.cookies.RequestsCookieJar'> <RequestsCookieJar[<Cookie test=test for />]>
{'a1': '123'}
{}
{'a3': '345'}
{'test': 'test', 'xx': 'xx', 'a1': '123', 'a3': '345'}

  总结及使用建议

  通过服务端打印可以看出,如果我们不设置User-Agent, requests模块的请求头是python-requests/2.21.0,这不是正常浏览器的请求头,这也是为什么我们做爬虫时一定要修改请求头的一个原因。

  使用requests.session()可以帮助我们保存这个会话过程中的所有cookie,可以省去我们自己获取上一个请求的cookie,然后更新cookie后重新设置再进行请求这类操作。

  通过s.cookies 和s.headers设置的整个会话中都会携带的cookie和header。

  通过s.get(url1, cookies={'r1': 'r1'},headers={'h2':'h2'}) 这种形式设置的cookie和header 不会覆盖s.cookies和s.headers中设置的请求头和cookie,只是在此次请求中添加此cookie和header,下个请求中不会携带这里的r1和h2。

  requests.utils.add_dict_to_cookiejar(s.cookies, {'xx': 'xx'}) 可以给s设置固定cookie:xx ,这种设置的cookie 不是临时的,后面的请求中都会携带。

  r1.cookies 的结果是RequestsCookieJar对象,可以通过dict对其转换,得到一个dict,其内容是r1请求响应头中设置的cookie,如果当前请求没有被设置新cookie,则dict后的是一个空字典。

  s.cookies 的结果是整个会话过程(通过s发送的所有请求的过程)被设置的cookie,所有通过dict(s.cookies) 可以得到所有被设置cookie

  建议我们再使用的过程中,把公共部分提前设置好,比如headers、cookies、proxies。

  最近使用发现,如果整个过程中某些cookie被多次设置,直接使用dict强转会失败,最稳妥的办法,还是使用requests.utils.dict_from_cookiejar(s.cookies)来得到字典类型的cookies。


作者:听风 

来源:http://www.51testing.com/html/80/n-7795580.html

  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          •   前言  支付系统,这个名词相信生活在当下社会的大家应该都不在陌生了吧,他时时刻刻充斥在我们的日常生活中,哪里有交易发生,哪里就有它的身影。其实直白的来说,支付系统是扮演着连接消费者、商家、银行和其他金融机构之间的桥梁角色。对于支付系统的质量保障活动自然也成为了金融行业中产品与项目阶段的重中之重,当然除了基础的功能测试之外,安全测试也是保障支付系统的另外一个重要的保障维度,那么做为一个从事测试工作十多余年的测试管理者来说,在我眼中的境外支付系统安全测试是什么样的呢?今天就由我来为大家详细的介绍一下吧。  概念  其实境外的支付系统与我国的支付系统本质上没有特别的大的区别,但因为其本身的系统特...
            0 0 628
            分享
          • 初次使用Jenkins部署自动化,记录下操作过程。安装Jenkins采用安装离线版Jenkins,将文件解压后,在Jenkins文件夹内启动终端,输入命令java -jar jenkins.war --httpPort=3344,启动。进入Jenkins页面输入账号密码。创建一个任务配置任务General目前仅需填写描述,其他不做了解。源码管理源码管理分两种方式,本底和远程(git/svn,两种操作方式类似)。git填写git地址以及账号密码。本地选无,然后把代码文件拉入Jenkins工作空间中(workspace)。构建触发器触发远程构建 (例如,使用脚本):使用远程脚本出发任务。Build...
            0 0 2639
            分享
          •   7 月 7 日晚,@懂车帝辟谣 官方微博发布首条消息,网传“懂车帝举办改装车大会被一锅端了”为谣言。  网传视频显示,一群人在地下车库中聚集,视频中确实出现了懂车帝标志的标牌。  IT之家注意到,懂车帝公告称,该活动系主办方自行组织的车友聚会活动,与懂车帝无关。现场围挡上带懂车帝品牌内容的物料为此前活动遗留,事发后被用来维护现场秩序,与本次活动无关。作者:汪淼原文链接:IT之家(ithome.com)
            0 0 495
            分享
          • 一、Web性能测试:(压力测试、负载测试、连接速度测试)1、压力测试:并发测试 (如500人同时登录邮箱)2、负载测试:根据场景设计测试用例如:100用户登录邮箱200用户查看新闻300用户查看科技3、连接速度测试:①用户连接到Web应用系统的速度根据上网方式的变化而变化,他们或许是电话拨号,或是宽带上网②如果Web系统响应时间太长(例如超过5秒钟),用户就会因没有耐心等待而离开③有些页面有超时的限制,如果响应速度太慢,用户可能还没来得及浏览内容,就需要重新登陆了④连接速度太慢,还可能引起数据丢失,使用户得不到真实的页面小结:测试内容 性能测试连接速度测试登入链接时间,页面刷新时间等...
            0 0 2199
            分享
          •   课题背景  版本验证是部署软件之前的最后一个测试操作,在软件产品完成了单元测试、集成测试和系统测试之后,产品发布之前所进行的软件测试活动。它是技术测试的最后一个阶段,也称为交付测试。该验证要求开发人员首先将程序部署在生产环境上,由测试人员通过筛选关键案例进行验证,确保程序主体正常运行。作为投产前的最后一步,版本验证对于整个产品质量的保证至关重要。随着数字化转型的深入,各类项目越来越复杂,测试人员需要执行的测试案例也越来越多,而版本验证通常需要在短时间内完成,既要确保关键案例都被执行,又要节省时间,避免重复验证,在保证测试质量地情况下提升测试效率。以往通过人工的方法进行版本验证案例筛选占用大...
            0 0 1071
            分享
      • 51testing软件测试圈微信