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算法之栈(stack)的实现
Aug 18 Python
python中的多重继承实例讲解
Sep 28 Python
Python使用xlrd读取Excel格式文件的方法
Mar 10 Python
由Python运算π的值深入Python中科学计算的实现
Apr 17 Python
Python使用迭代器打印螺旋矩阵的思路及代码示例
Jul 02 Python
Python语言实现将图片转化为html页面
Dec 06 Python
Sanic框架配置操作分析
Jul 17 Python
根据tensor的名字获取变量的值方式
Jan 04 Python
Python3批量创建Crowd用户并分配组
May 20 Python
解决keras,val_categorical_accuracy:,0.0000e+00问题
Jul 02 Python
python实现MySQL指定表增量同步数据到clickhouse的脚本
Feb 26 Python
Python实现制作销售数据可视化看板详解
Nov 27 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脚本的10个技巧(1)
2006/10/09 PHP
PHP 采集获取指定网址的内容
2010/01/05 PHP
逆序二维数组插入一元素的php代码
2012/06/08 PHP
php中存储用户ID和密码到mysql数据库的方法
2013/02/06 PHP
PHP循环遍历数组的3种方法list()、each()和while总结
2014/11/19 PHP
php实现四舍五入的方法小结
2015/03/03 PHP
PHP 验证登陆类分享
2015/03/13 PHP
PHP扩展迁移为PHP7扩展兼容性问题记录
2016/02/15 PHP
使用javascript:将其它类型值转换成布尔类型值的解决方法详解
2013/05/07 Javascript
jQuery中even选择器的定义和用法
2014/12/23 Javascript
JavaScript 函数的执行过程
2016/05/09 Javascript
JavaScript的ExtJS框架中数面板TreePanel的使用实例解析
2016/05/21 Javascript
js时间比较 js计算时间差的简单实现方法
2016/08/26 Javascript
Vue.js双向绑定操作技巧(初级入门)
2016/12/27 Javascript
jQuery基于ajax方式实现用户名存在性检查功能示例
2017/02/10 Javascript
bootstrap下拉分页样式 带跳转页码
2018/12/29 Javascript
解决element ui select下拉框不回显数据问题的解决
2019/02/20 Javascript
JS实现从对象获取对象中单个键值的方法示例
2019/06/05 Javascript
[01:12:27]EG vs Secret 2018国际邀请赛淘汰赛BO3 第二场 8.22
2018/08/23 DOTA
python中使用mysql数据库详细介绍
2015/03/27 Python
python获取从命令行输入数字的方法
2015/04/29 Python
Django实现的自定义访问日志模块示例
2017/06/23 Python
jupyter lab文件导出/下载方式
2020/04/22 Python
Python常用类型转换实现代码实例
2020/07/28 Python
python字典key不能是可以是啥类型
2020/08/04 Python
深入解析HTML5中的Blob对象的使用
2015/09/08 HTML / CSS
HTML5本地存储之Web Storage详解
2016/07/04 HTML / CSS
瑞典在互联网上最大的宠物商店:Animail
2020/10/31 全球购物
三查三看党性分析材料
2014/02/18 职场文书
幼儿园教师的自我评价范文
2014/09/17 职场文书
院党委组织查摆问题对照检查材料思想汇报2014
2014/10/08 职场文书
2014年应急工作总结
2014/12/11 职场文书
计划生育目标责任书
2015/05/09 职场文书
婚礼家长致辞
2015/07/27 职场文书
高中体育课教学反思
2016/02/16 职场文书
spring IOC容器的Bean管理XML自动装配过程
2022/05/30 Java/Android