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 相关文章推荐
Python3.0与2.X版本的区别实例分析
Aug 25 Python
python使用xlrd与xlwt对excel的读写和格式设定
Jan 21 Python
基于pycharm导入模块显示不存在的解决方法
Oct 13 Python
Python判断是否json是否包含一个key的方法
Dec 31 Python
pyqt5利用pyqtDesigner实现登录界面
Mar 28 Python
详解python 模拟豆瓣登录(豆瓣6.0)
Apr 18 Python
python主线程与子线程的结束顺序实例解析
Dec 17 Python
python不使用for计算两组、多个矩形两两间的iou方式
Jan 18 Python
Python如何在DataFrame增加数值
Feb 14 Python
利用PyTorch实现VGG16教程
Jun 24 Python
Django如何批量创建Model
Sep 01 Python
健身房被搭讪?用python写了个小米计时器助人为乐
Jun 08 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 number_format() 函数定义和用法
2012/06/01 PHP
编写Smarty插件在模板中直接加载数据的详细介绍
2013/06/26 PHP
php递归删除指定文件夹的方法小结
2015/04/20 PHP
Laravel5.0+框架邮件发送功能实现方法图文与实例详解
2019/04/23 PHP
一款JavaScript压缩工具:X2JSCompactor
2007/06/13 Javascript
JavaScript CSS修改学习第二章 样式
2010/02/19 Javascript
Javascript call和apply区别及使用方法
2013/11/14 Javascript
一个支持任意尺寸的图片上下左右滑动效果
2014/08/24 Javascript
JavaScript实现更改网页背景与字体颜色的方法
2015/02/02 Javascript
JavaScript操作DOM元素的childNodes和children区别
2015/04/01 Javascript
JavaScript中pop()方法的使用教程
2015/06/09 Javascript
利用JS生成博文目录及CSS定制博客
2016/02/10 Javascript
第四篇Bootstrap网格系统偏移列和嵌套列
2016/06/21 Javascript
JS正则表达式学习之贪婪和非贪婪模式实例总结
2016/12/26 Javascript
javascript基本数据类型和转换
2017/03/17 Javascript
vue.js 初体验之Chrome 插件开发实录
2017/05/13 Javascript
详解vue项目构建与实战
2017/06/27 Javascript
jQuery使用ajax_动力节点Java学院整理
2017/07/05 jQuery
React应用中使用Bootstrap的方法
2017/08/15 Javascript
JS实现浏览上传文件的代码
2017/08/23 Javascript
JavaScript实现的反序列化json字符串操作示例
2018/07/18 Javascript
vue基础之data存储数据及v-for循环用法示例
2019/03/08 Javascript
js实现转动骰子模型
2019/10/24 Javascript
vue 基于abstract 路由模式 实现页面内嵌的示例代码
2020/12/14 Vue.js
python pickle 和 shelve模块的用法
2013/09/16 Python
Python获取单个程序CPU使用情况趋势图
2015/03/10 Python
分享一下如何编写高效且优雅的 Python 代码
2017/09/07 Python
基于python(urlparse)模板的使用方法总结
2017/10/13 Python
Python 日志logging模块用法简单示例
2019/10/18 Python
python搜索算法原理及实例讲解
2020/11/18 Python
Python实现Word文档转换Markdown的示例
2020/12/22 Python
外贸主管求职简历的自我评价
2013/10/23 职场文书
学生意外伤害赔偿协议书
2014/09/17 职场文书
追悼会家属答谢词
2015/09/29 职场文书
Python torch.flatten()函数案例详解
2021/08/30 Python
浅谈音视频 pts dts基本概念及理解
2022/08/05 数码科技