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 27 Python
python opencv之分水岭算法示例
Feb 24 Python
Python3导入自定义模块的三种方法详解
Apr 13 Python
深入浅析Python传值与传址
Jul 10 Python
PyCharm 设置SciView工具窗口的方法
Jan 15 Python
Python匿名函数及应用示例
Apr 09 Python
你还在@微信官方?聊聊Python生成你想要的微信头像
Sep 25 Python
Tensorflow 1.0之后模型文件、权重数值的读取方式
Feb 12 Python
Python对称的二叉树多种思路实现方法
Feb 28 Python
Python通过4种方式实现进程数据通信
Mar 12 Python
2021年的Python 时间轴和即将推出的功能详解
Jul 27 Python
Python爬虫逆向分析某云音乐加密参数的实例分析
Dec 04 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使用反射插入对象示例分享
2014/03/11 PHP
php命令行(cli)模式下报require 加载路径错误的解决方法
2015/11/23 PHP
PHP操作Redis常用命令的实例详解
2020/12/23 PHP
jquery一句话全选/取消全选
2011/03/01 Javascript
Javascript加载速度慢的解决方案
2014/03/11 Javascript
javascript 实现map集合
2015/04/03 Javascript
jquery实用技巧之输入框提示语句
2016/07/28 Javascript
Node.js的基本知识简单汇总
2016/09/19 Javascript
基于touch.js手势库+zepto.js插件开发图片查看器(滑动、缩放、双击缩放)
2016/11/17 Javascript
JS判断是否手机或pad访问实现方法
2016/12/09 Javascript
jquery mobile移动端幻灯片滑动切换效果
2020/04/15 Javascript
JS一个简单的注册页面实例
2017/09/05 Javascript
简单介绍react redux的中间件的使用
2018/04/06 Javascript
如何制作一个Node命令行图像识别工具
2018/12/12 Javascript
react组件从搭建脚手架到在npm发布的步骤实现
2019/01/09 Javascript
微信小程序与公众号实现数据互通的方法
2019/07/25 Javascript
vue 中的动态传参和query传参操作
2020/11/09 Javascript
[00:36]DOTA2上海特级锦标赛 LGD战队宣传片
2016/03/04 DOTA
python编写网页爬虫脚本并实现APScheduler调度
2014/07/28 Python
Python3基础之基本运算符概述
2014/08/13 Python
在Python的Django框架的视图中使用Session的方法
2015/07/23 Python
Python实现字符串反转的常用方法分析【4种方法】
2017/09/30 Python
Window环境下Scrapy开发环境搭建
2018/11/18 Python
OpenCV 之按位运算举例解析
2020/06/19 Python
css3 border-radius属性详解
2017/07/05 HTML / CSS
狗狗玩具、零食和咀嚼物的月度送货服务:Super Chewer
2018/08/22 全球购物
亚马逊加拿大网站:Amazon.ca
2020/01/06 全球购物
电气工程和自动化自荐信范文
2013/12/25 职场文书
八年级物理教学反思
2014/01/19 职场文书
表彰大会主持词
2014/03/26 职场文书
幼儿园中班开学寄语
2014/04/03 职场文书
2014党的群众路线教育实践活动总结报告
2014/10/31 职场文书
护理工作个人总结
2015/03/03 职场文书
老员工辞职信范文
2015/05/12 职场文书
乡镇干部学习心得体会
2016/01/23 职场文书
Python办公自动化之Excel(中)
2021/05/24 Python