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 元组(Tuple)操作详解
Mar 11 Python
python中for语句简单遍历数据的方法
May 07 Python
python 链接和操作 memcache方法
Mar 04 Python
Python编程之黑板上排列组合,你舍得解开吗
Oct 30 Python
对python中的logger模块全面讲解
Apr 28 Python
Django集成搜索引擎Elasticserach的方法示例
Jun 04 Python
python向字符串中添加元素的实例方法
Jun 28 Python
使用 Python 清理收藏夹里已失效的网站
Dec 03 Python
opencv3/python 鼠标响应操作详解
Dec 11 Python
Win10下配置tensorflow-gpu的详细教程(无VS2015/2017)
Jul 14 Python
python多线程semaphore实现线程数控制的示例
Aug 10 Python
Linux系统下升级pip的完整步骤
Jan 31 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和ACCESS写聊天室(七)
2006/10/09 PHP
测试php函数的方法
2013/11/13 PHP
php中使用gd库实现下载网页中所有图片
2015/05/12 PHP
php示例详解Constructor Prototype Pattern 原型模式
2015/10/15 PHP
学习PHP Cookie处理函数
2016/08/09 PHP
PHP合并数组的2种方法小结
2016/11/24 PHP
用PHP的socket实现客户端到服务端的通信实例详解
2017/02/04 PHP
Yii 2.0实现联表查询加搜索分页的方法示例
2017/08/02 PHP
详解PHP变量传值赋值和引用赋值变量销毁
2019/03/23 PHP
表单序列化与jq中的serialize使用示例
2014/02/21 Javascript
浅析javascript中的DOM
2015/03/01 Javascript
两种JS实现屏蔽鼠标右键的方法
2020/08/20 Javascript
JS实现上下左右对称的九九乘法表
2016/02/22 Javascript
Bootstrap3制作自己的导航栏
2016/05/12 Javascript
js操作数据库实现注册和登陆的简单实例
2016/05/26 Javascript
jQuery简单实现页面元素置顶时悬浮效果示例
2016/08/01 Javascript
基于JavaScript实现添加到购物车效果附源码下载
2016/08/22 Javascript
jQuery web 组件 后台日历价格、库存设置的代码
2016/10/14 Javascript
angular.js 路由及页面传参示例
2017/02/24 Javascript
select标签设置默认选中的选项方法
2018/03/02 Javascript
Vue绑定内联样式问题
2018/10/17 Javascript
浅谈小程序 setData学问多
2019/02/20 Javascript
微信小程序动态设置图片大小的方法
2019/11/21 Javascript
[03:28]2014DOTA2国际邀请赛 EG战队官方纪录片
2014/07/21 DOTA
[37:29]完美世界DOTA2联赛PWL S2 LBZS vs Forest 第二场 11.19
2020/11/19 DOTA
python3 发送任意文件邮件的实例
2018/01/23 Python
python之pexpect实现自动交互的例子
2019/07/25 Python
python 实现矩阵按对角线打印
2019/11/29 Python
中东地区为妈妈们提供一切的头号购物目的地:Sprii
2018/05/06 全球购物
医学检验专业个人求职信范文
2013/12/04 职场文书
建材业务员岗位职责
2013/12/08 职场文书
幼儿运动会邀请函
2014/01/17 职场文书
高校教师自荐信范文
2014/03/13 职场文书
保护环境建议书100字
2014/05/13 职场文书
基于go interface{}==nil 的几种坑及原理分析
2021/04/24 Golang
为什么在foreach循环中JAVA集合不能添加或删除元素
2021/06/11 Java/Android