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实现哈希表
Feb 07 Python
python实现查询苹果手机维修进度
Mar 16 Python
为Python程序添加图形化界面的教程
Apr 29 Python
深入理解 Python 中的多线程 新手必看
Nov 20 Python
python中的tcp示例详解
Dec 09 Python
Python使用Shelve保存对象方法总结
Jan 28 Python
Python 通过打码平台实现验证码的实现
May 13 Python
对PyQt5基本窗口控件 QMainWindow的使用详解
Jun 19 Python
python通过链接抓取网站详解
Nov 20 Python
Python 如何展开嵌套的序列
Aug 01 Python
python爬虫---requests库的用法详解
Sep 28 Python
python tqdm实现进度条的示例代码
Nov 10 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
PHP5 操作MySQL数据库基础代码
2009/09/29 PHP
PHP实现提取一个图像文件并在浏览器上显示的代码
2012/10/06 PHP
PHP计算近1年的所有月份
2017/03/13 PHP
JavaScript起点(严格模式深度了解)
2013/01/28 Javascript
jQuery判断div随滚动条滚动到一定位置后停止
2014/04/02 Javascript
JS模拟简易滚动条效果代码(附demo源码)
2016/04/05 Javascript
JavaScript6 let 新语法优势介绍
2016/07/15 Javascript
Javascript 数组去重的方法(四种)详解及实例代码
2016/11/24 Javascript
jQuery快速高效制作网页交互特效
2017/02/24 Javascript
详解Angular路由 ng-route和ui-router的区别
2017/05/22 Javascript
利用JS测试目标网站的打开响应速度
2017/12/01 Javascript
JavaScript寄生组合式继承实例详解
2018/01/06 Javascript
vue中axios的封装问题(简易版拦截,get,post)
2018/06/15 Javascript
JavaScript常用8种数组去重代码实例
2020/09/09 Javascript
[07:47]DOTA2国际邀请赛采访专栏:探访Valve总部
2013/08/08 DOTA
Python SQLAlchemy基本操作和常用技巧(包含大量实例,非常好)
2014/05/06 Python
Python提取Linux内核源代码的目录结构实现方法
2016/06/24 Python
python PyTorch参数初始化和Finetune
2018/02/11 Python
使用tensorflow显示pb模型的所有网络结点方式
2020/01/23 Python
Python安装OpenCV的示例代码
2020/03/05 Python
PyInstaller运行原理及常用操作详解
2020/06/13 Python
详解Python多线程下的list
2020/07/03 Python
纯css3实现鼠标经过图片显示描述的动画效果
2014/09/01 HTML / CSS
一款css实现的鼠标经过按钮的特效
2014/09/11 HTML / CSS
深入浅析HTML5中的SVG
2015/11/27 HTML / CSS
Reebonz中国官网:新加坡奢侈品购物网站
2017/03/17 全球购物
英国排名第一的停车场运营商:NCP
2019/08/26 全球购物
德国购买踏板车网站:Microscooter
2019/10/14 全球购物
MySQL面试题目集锦
2016/04/14 面试题
工作失误检讨书范文大全
2014/01/13 职场文书
前厅部经理岗位职责范文
2014/02/04 职场文书
学校后勤岗位职责
2014/02/19 职场文书
商务助理求职信范文
2014/04/20 职场文书
2016年国庆节假期旅游工作总结
2016/04/01 职场文书
「SHOW BY ROCK!!」“雫シークレットマインド”组合单曲MV公开
2022/03/21 日漫
vue项目打包后路由错误的解决方法
2022/04/13 Vue.js