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 相关文章推荐
使用IPython下的Net-SNMP来管理类UNIX系统的教程
Apr 15 Python
Python使用win32com实现的模拟浏览器功能示例
Jul 13 Python
python 3.6 tkinter+urllib+json实现火车车次信息查询功能
Dec 20 Python
Python发送http请求解析返回json的实例
Mar 26 Python
使用python爬取B站千万级数据
Jun 08 Python
python实现批量视频分帧、保存视频帧
May 31 Python
利用Pandas和Numpy按时间戳将数据以Groupby方式分组
Jul 22 Python
Django 用户认证组件使用详解
Jul 23 Python
pandas实现DataFrame显示最大行列,不省略显示实例
Dec 26 Python
Python连接字符串过程详解
Jan 06 Python
40行Python代码实现天气预报和每日鸡汤推送功能
Feb 27 Python
python爬虫scrapy框架之增量式爬虫的示例代码
Feb 26 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 一个随机字符串生成代码
2010/05/26 PHP
php使用base64加密解密图片示例分享
2014/01/20 PHP
PHP编写登录验证码功能 附调用方法
2016/05/19 PHP
js 获取子节点函数 (兼容FF与IE)
2010/04/18 Javascript
JavaScript 程序编码规范
2010/11/23 Javascript
Js实现无刷新删除内容
2015/04/29 Javascript
jQuery右下角旋转环状菜单特效代码
2015/08/10 Javascript
浅谈javascript的Array.prototype.slice.call
2015/08/31 Javascript
javascript拖拽应用实例(二)
2016/03/25 Javascript
Node.js DES加密的简单实现
2016/07/07 Javascript
vue.js入门教程之基础语法小结
2016/09/01 Javascript
微信小程序 教程之注册页面
2016/10/17 Javascript
JavaScript之WebSocket技术详解
2016/11/18 Javascript
Angular 输入框实现自定义验证功能
2017/02/19 Javascript
Webpack打包css后z-index被重新计算的解决方法
2017/06/18 Javascript
node.js+captchapng+jsonwebtoken实现登录验证示例
2017/08/17 Javascript
删除table表格行的实例讲解
2017/09/21 Javascript
微信小程序template模板实例详解
2017/10/27 Javascript
JavaScript检查数据中是否存在相同的元素(两种方法)
2018/10/07 Javascript
Vue Prop属性功能与用法实例详解
2019/02/23 Javascript
详解vue 路由跳转四种方式 (带参数)
2019/04/28 Javascript
使用vue打包进行云服务器上传的问题
2020/03/02 Javascript
用Python编写一个简单的FUSE文件系统的教程
2015/04/02 Python
Centos部署django服务nginx+uwsgi的方法
2019/01/02 Python
Python docx库用法示例分析
2019/02/16 Python
python通过TimedRotatingFileHandler按时间切割日志
2019/07/17 Python
python基于plotly实现画饼状图代码实例
2019/12/16 Python
python logging.info在终端没输出的解决
2020/05/12 Python
使用phonegap创建联系人的实现方法
2017/03/30 HTML / CSS
能源工程专业应届生求职信
2014/03/01 职场文书
办公室打字员岗位职责
2014/04/16 职场文书
党员四风问题个人对照检查材料
2014/10/26 职场文书
小学生通知书评语
2014/12/31 职场文书
幼儿园安全工作总结2015
2015/04/20 职场文书
技术入股合作协议书
2016/03/21 职场文书
死磕 java同步系列之synchronized解析
2021/06/28 Java/Android