python对于requests的封装方法详解


Posted in Python onJanuary 03, 2019

由于requests是http类接口的核心,因此封装前考虑问题比较多:

1. 对多种接口类型的支持;

2. 连接异常时能够重连;

3. 并发处理的选择;

4. 使用方便,容易维护;

当前并未全部实现,后期会不断完善。重点提一下并发处理的选择:python的并发处理机制由于存在GIL的原因,实现起来并不是很理想,综合考虑多进程、多线程、协程,在不考虑大并发性能测试的前提下使用了多线程-线程池的形式实现。使用的是

concurrent.futures模块。当前仅方便支持webservice接口。

# -*- coding:utf-8 -*-
 
import requests
from concurrent.futures import ThreadPoolExecutor
from Tools.Config import Config # 配置文件读取
from Tools.Log import Log # 日志管理
from Tools.tools import decoLOG # 日志装饰
 
'''
  功能:   Requests类
  使用方法: 
  作者:   郭可昌
  作成时间: 20180224
  更新内容:
  更新时间:
'''
class Requests(object):
  def __init__(self):
    self.session = requests.session()
    self.header = {}
    # URL默认来源于配置文件,方便不同测试环境的切换,也可以动态设定
    self.URL = Config().getURL()
    # 默认60s,可以动态设定
    self.timeout = 60
    #http连接异常的场合,重新连接的次数,默认为3,可以动态设定
    self.iRetryNum = 3
 
    self.errorMsg = ""
    # 内容 = {用例编号:响应数据}
    self.responses = {}
    # 内容 = {用例编号:异常信息}
    self.resErr={}
 
 
  # 原始post使用保留
  # bodyData: request's data
  @decoLOG
  def post(self, bodyData):
    response = None
    self.errorMsg = ""
 
    try:
      response = self.session.post(self.URL, data=bodyData.encode('utf-8'), headers=self.header, timeout=self.timeout)
      response.raise_for_status()
    except Exception as e:
      self.errorMsg = str(e)
      Log().logger.error("HTTP请求异常,异常信息:%s" % self.errorMsg)
    return response
 
 
  # 复数请求并发处理,采用线程池的形式,用例数>线程池的容量:线程池的容量为并发数,否则,用例数为并发数
  # dicDatas: {用例编号:用例数据}
  @decoLOG
  def req_all(self, dicDatas, iThreadNum=5):
 
    if len(dict(dicDatas)) < 1:
      Log().logger.error("没有测试对象,请确认后再尝试。。。")
      return self.responses.clear()
 
    # 请求用例集合转换(用例编号,用例数据)
    seed = [i for i in dicDatas.items()]
    self.responses.clear()
 
    # 线程池并发执行,iThreadNum为并发数
    with ThreadPoolExecutor(iThreadNum) as executor:
      executor.map(self.req_single,seed)
 
    # 返回所有请求的响应信息({用例编号:响应数据}),http连接异常:对应None
    return self.responses
 
  # 用于单用例提交,http连接失败可以重新连接,最大重新连接数可以动态设定
  def req_single(self, listData, reqType="post", iLoop=1):
    response = None
    # 如果达到最大重连次数,连接后提交结束
    if iLoop == self.iRetryNum:
      if reqType == "post":
        try:
          response = requests.post(self.URL, data=listData[1].encode('utf-8'), headers=self.header,
                       timeout=self.timeout)
          response.raise_for_status()
        except Exception as e:
          # 异常信息保存只在最大连接次数时进行,未达到最大连接次数,异常信息为空
          self.resErr[listData[0]] = str(e)
          Log().logger.error("HTTP请求异常,异常信息:%s【%d】" % (str(e), iLoop))
 
        self.responses[listData[0]] = response
      else:
        # for future: other request method expand
        pass
    # 未达到最大连接数,如果出现异常,则重新连接尝试
    else:
      if reqType == "post":
        try:
          response = requests.post(self.URL, data=listData[1].encode('utf-8'), headers=self.header,
                       timeout=self.timeout)
          response.raise_for_status()
        except Exception as e:
          Log().logger.error("HTTP请求异常,异常信息:%s【%d】" % (str(e), iLoop))
          # 重连次数递增
          iLoop += 1
          # 进行重新连接
          self.req_single(listData, reqType, iLoop)
          # 当前连接终止
          return None
        self.responses[listData[0]] = response
      else:
        # for future: other request method expand
        pass
 
  # 设定SoapAction, 快捷完成webservice接口header设定
  def setSoapAction(self, soapAction):
    self.header["SOAPAction"] = soapAction
    self.header["Content-Type"] = "text/xml;charset=UTF-8"
    self.header["Connection"] = "Keep-Alive"
    self.header["User-Agent"] = "InterfaceAutoTest-run"

以上这篇python对于requests的封装方法详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python和bash统计CPU利用率的方法
Jul 10 Python
Python使用matplotlib的pie函数绘制饼状图功能示例
Jan 08 Python
可能是最全面的 Python 字符串拼接总结【收藏】
Jul 09 Python
浅谈Python的list中的选取范围
Nov 12 Python
对python3新增的byte类型详解
Dec 04 Python
Python递归函数实例讲解
Feb 27 Python
Python 中PyQt5 点击主窗口弹出另一个窗口的实现方法
Jul 04 Python
Python中模块(Module)和包(Package)的区别详解
Aug 07 Python
python、PyTorch图像读取与numpy转换实例
Jan 13 Python
Python多线程操作之互斥锁、递归锁、信号量、事件实例详解
Mar 24 Python
python上传时包含boundary时的解决方法
Apr 08 Python
Django url 路由匹配过程详解
Jan 22 Python
python使用suds调用webservice接口的方法
Jan 03 #Python
Python调用服务接口的实例
Jan 03 #Python
Python2和Python3之间的str处理方式导致乱码的讲解
Jan 03 #Python
python requests 库请求带有文件参数的接口实例
Jan 03 #Python
Python图像处理之颜色的定义与使用分析
Jan 03 #Python
Python在图片中插入大量文字并且自动换行
Jan 02 #Python
python 输出所有大小写字母的方法
Jan 02 #Python
You might like
PHP完整的日历类(CLASS)
2006/11/27 PHP
php使用Session和文件统计在线人数
2015/07/04 PHP
php实现将二维关联数组转换成字符串的方法详解
2017/07/31 PHP
thinkPHP3.2.2框架行为扩展及demo示例
2018/06/19 PHP
几个javascript操作word的参考代码
2009/10/26 Javascript
网站导致浏览器崩溃的原因总结(多款浏览器) 推荐
2010/04/15 Javascript
jQuery cdn使用介绍
2013/05/08 Javascript
JavaScript分页功能的实现方法
2015/04/25 Javascript
Javascript显示和隐藏ul列表的方法
2015/07/15 Javascript
一种新的javascript对象创建方式Object.create()
2015/12/28 Javascript
JavaScript实现获取某个元素相邻兄弟节点的prev与next方法
2016/01/25 Javascript
Javascript之面向对象--方法
2016/12/02 Javascript
NodeJs测试框架Mocha的安装与使用
2017/03/28 NodeJs
深入理解ES6的迭代器与生成器
2017/08/19 Javascript
vue.js实现只弹一次弹框
2018/01/29 Javascript
elementUI select组件使用及注意事项详解
2019/05/29 Javascript
Nautil 中使用双向数据绑定的实现
2019/10/02 Javascript
js和jquery判断数据类型的4种方法总结
2020/08/28 jQuery
Vue Elenent实现表格相同数据列合并
2020/11/30 Vue.js
[00:52]DOTA2第二届亚洲邀请赛预选赛宣传片
2017/01/13 DOTA
详解Python的Twisted框架中reactor事件管理器的用法
2016/05/25 Python
Python Django使用forms来实现评论功能
2016/08/17 Python
python使用selenium实现批量文件下载
2019/03/11 Python
解决pyecharts在jupyter notebook中使用报错问题
2020/04/23 Python
Python使用Pandas对csv文件进行数据处理的方法
2019/08/01 Python
django ajax发送post请求的两种方法
2020/01/05 Python
Python unittest单元测试框架及断言方法
2020/04/15 Python
matplotlib对象拾取事件处理的实现
2021/01/14 Python
如何用Python进行时间序列分解和预测
2021/03/01 Python
欧洲第一的摇滚和金属乐队服装网站:EMP
2017/10/26 全球购物
医院见习报告范文
2014/11/03 职场文书
教师党员学习十八届四中全会思想汇报
2014/11/03 职场文书
毕业生对母校寄语
2015/02/26 职场文书
2015年客房服务员工作总结
2015/05/15 职场文书
小学生读书笔记范文
2015/06/30 职场文书
Java移除无效括号的方法实现
2021/08/07 Java/Android