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实现建立SSH连接的方法
Jun 03 Python
Python脚本实现自动发带图的微博
Apr 27 Python
Python+Selenium+PIL+Tesseract自动识别验证码进行一键登录
Sep 20 Python
EM算法的python实现的方法步骤
Jan 02 Python
基于Python 装饰器装饰类中的方法实例
Apr 21 Python
Python 从相对路径下import的方法
Dec 04 Python
pytorch 转换矩阵的维数位置方法
Dec 08 Python
Django 创建新App及其常用命令的实现方法
Aug 04 Python
Python PIL图片添加字体的例子
Aug 22 Python
python图形界面开发之wxPython树控件使用方法详解
Feb 24 Python
Python loguru日志库之高效输出控制台日志和日志记录
Mar 07 Python
基于Python pyecharts实现多种图例代码解析
Aug 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
一拳超人中怪人协会钦定! S级别最强四人!
2020/03/02 日漫
PHP4和PHP5共存于一系统
2006/11/17 PHP
轻松修复Discuz!数据库
2008/05/03 PHP
apache+codeigniter 通过.htcaccess做动态二级域名解析
2012/07/01 PHP
ThinkPHP、ZF2、Yaf、Laravel框架路由大比拼
2015/03/25 PHP
PHP面向对象五大原则之里氏替换原则(LSP)详解
2018/04/08 PHP
从盛大通行证上摘下来的身份证验证js代码
2011/01/11 Javascript
js setTimeout()函数介绍及应用以倒计时为例
2013/12/12 Javascript
js操作IE浏览器弹出浏览文件夹可以返回目录路径
2014/07/14 Javascript
学习javascript面向对象 理解javascript对象
2016/01/04 Javascript
学习JavaScript事件流和事件处理程序
2016/01/25 Javascript
Node.js设置CORS跨域请求中多域名白名单的方法
2017/03/28 Javascript
Spring shiro + bootstrap + jquery.validate 实现登录、注册功能
2017/06/02 jQuery
Vue.js移动端左滑删除组件的实现代码
2017/09/08 Javascript
Angular5中状态管理的实现
2018/09/03 Javascript
JavaScript使用表单元素验证表单的示例代码
2019/08/20 Javascript
浅析vue中的provide / inject 有什么用处
2019/11/10 Javascript
深入解析微信小程序开发中遇到的几个小问题
2020/07/11 Javascript
详解js中的几种常用设计模式
2020/07/16 Javascript
Python3基础之list列表实例解析
2014/08/13 Python
跟老齐学Python之再深点,更懂list
2014/09/20 Python
python实现简单的TCP代理服务器
2014/10/08 Python
python 筛选数据集中列中value长度大于20的数据集方法
2018/06/14 Python
Python matplotlib通过plt.scatter画空心圆标记出特定的点方法
2018/12/13 Python
将Python字符串生成PDF的实例代码详解
2019/05/17 Python
Pytorch中的VGG实现修改最后一层FC
2020/01/15 Python
Python接口测试文件上传实例解析
2020/05/22 Python
pycharm开发一个简单界面和通用mvc模板(操作方法图解)
2020/05/27 Python
Python+PyQt5+MySQL实现天气管理系统
2020/06/16 Python
python与idea的集成的实现
2020/11/20 Python
采购员岗位职责
2013/11/15 职场文书
工厂门卫岗位职责
2013/11/25 职场文书
2016年大学生暑期社会实践方案
2015/11/26 职场文书
听课评课活动心得体会
2016/01/15 职场文书
导游词之烟台威海蓬莱
2019/11/14 职场文书
SpringBoot 整合mongoDB并自定义连接池的示例代码
2022/02/28 MongoDB