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程序的循环的运行效率的原因
Apr 01 Python
使用apidocJs快速生成在线文档的实例讲解
Feb 07 Python
python如何实现int函数的方法示例
Feb 19 Python
mvc框架打造笔记之wsgi协议的优缺点以及接口实现
Aug 01 Python
python爬取淘宝商品销量信息
Nov 16 Python
python判断一个数是否能被另一个整数整除的实例
Dec 12 Python
django之静态文件 django 2.0 在网页中显示图片的例子
Jul 28 Python
翻转数列python实现,求前n项和,并能输出整个数列的案例
May 03 Python
Python分析最近大火的网剧《隐秘的角落》
Jul 02 Python
浅谈优化Django ORM中的性能问题
Jul 09 Python
将不规则的Python多维数组拉平到一维的方法实现
Jan 11 Python
Python机器学习之逻辑回归
May 11 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
新浪SAE云平台下使用codeigniter的数据库配置
2014/06/12 PHP
PHP 微信支付类 demo
2015/11/30 PHP
Yii 2.0中场景的使用教程
2017/06/02 PHP
PHP基于PDO扩展操作mysql数据库示例
2018/12/24 PHP
html下载本地
2006/06/19 Javascript
Node.js的特点和应用场景介绍
2014/11/04 Javascript
8个超实用的jQuery功能代码分享
2015/01/08 Javascript
jQuery简单实现隐藏以及显示特效
2015/02/26 Javascript
JavaScript实现多个重叠层点击切换效果的方法
2015/04/24 Javascript
AngularJS进行性能调优的7个建议
2015/12/28 Javascript
JavaScript iframe数据共享接口实现方法
2016/01/06 Javascript
JS控制FileUpload的上传文件类型实例代码
2016/10/07 Javascript
实例解析jQuery工具函数
2016/12/01 Javascript
JavaScript实现Fly Bird小游戏
2016/12/15 Javascript
Vue 2.0中生命周期与钩子函数的一些理解
2017/05/09 Javascript
详谈innerHTML innerText的使用和区别
2017/08/18 Javascript
ionic2懒加载配置详解
2017/09/01 Javascript
妙用缓存调用链实现JS方法的重载
2018/04/30 Javascript
详解关于微信setData回调函数中的坑
2019/02/18 Javascript
详解小程序退出页面时清除定时器
2019/04/28 Javascript
python3 pillow生成简单验证码图片的示例
2017/09/19 Python
Python数据结构与算法之二叉树结构定义与遍历方法详解
2017/12/12 Python
Python实现查找二叉搜索树第k大的节点功能示例
2019/01/24 Python
python 字符串的驻留机制及优缺点
2020/06/19 Python
彻底弄明白CSS3的Media Queries(跨平台设计)
2010/07/27 HTML / CSS
谈谈对css属性box-sizing的了解
2017/01/04 HTML / CSS
HTML5 Canvas实现图片缩放、翻转、颜色渐变的代码示例
2016/02/28 HTML / CSS
Expedia瑞典官网:预订度假屋、酒店、汽车租赁、机票等
2021/01/23 全球购物
学校后勤岗位职责
2014/02/19 职场文书
有多年工作经验的自我评价
2014/03/02 职场文书
入股协议书范本
2014/04/14 职场文书
公安机关起诉意见书
2015/05/20 职场文书
《文化苦旅》读后感:阅读,让人诗意地栖居在大地上
2019/12/24 职场文书
JAVA springCloud项目搭建流程
2022/05/11 Java/Android
python可视化分析绘制带趋势线的散点图和边缘直方图
2022/06/25 Python
html网页引入svg图片的4种方式
2022/08/05 HTML / CSS