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 相关文章推荐
linux系统使用python获取内存使用信息脚本分享
Jan 15 Python
解析Python中的变量、引用、拷贝和作用域的问题
Apr 07 Python
Djang中静态文件配置方法
Jul 30 Python
Python迭代和迭代器详解
Nov 10 Python
python中不能连接超时的问题及解决方法
Jun 10 Python
解决pandas使用read_csv()读取文件遇到的问题
Jun 15 Python
Python用5行代码写一个自定义简单二维码
Oct 21 Python
Python合并2个字典成1个新字典的方法(9种)
Dec 19 Python
Python3 A*寻路算法实现方式
Dec 24 Python
Python Django中的STATIC_URL 设置和使用方式
Mar 27 Python
python numpy中setdiff1d的用法说明
Apr 22 Python
如何利用Matlab制作一款真正的拼图小游戏
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
怎样才能成为PHP高手?学会“懒惰”的编程
2006/12/05 PHP
PHP获取php,mysql,apche的版本信息示例代码
2014/01/16 PHP
php实现保存周期为1天的购物车类
2017/07/07 PHP
thinkphp5.1 框架导入/导出excel文件操作示例
2020/05/25 PHP
PHP基于phpqrcode类生成二维码的方法示例详解
2020/08/07 PHP
prototype Element学习笔记(Element篇三)
2008/10/26 Javascript
Javascript控制页面链接在新窗口打开具体方法
2013/08/16 Javascript
JavaScript实现的圆形浮动标签云效果实例
2015/08/06 Javascript
H5实现中奖记录逐行滚动切换效果
2017/03/13 Javascript
vue.js select下拉框绑定和取值方法
2018/03/03 Javascript
jQuery实现判断上传图片类型和大小的方法示例
2018/04/11 jQuery
详解vue 计算属性与方法跟侦听器区别(面试考点)
2018/04/23 Javascript
vue路由拦截及页面跳转的设置方法
2018/05/24 Javascript
详解基于 Node.js 的轻量级云函数功能实现
2019/07/08 Javascript
深入了解Hybrid App技术的相关知识
2019/07/17 Javascript
微信小程序自定义头部导航栏和导航栏背景图片 navigationStyle问题
2019/07/26 Javascript
vue实现滑动到底部加载更多效果
2020/10/27 Javascript
JavaScrip如果基于url实现图片下载
2020/07/03 Javascript
Element-UI 使用el-row 分栏布局的教程
2020/10/26 Javascript
vue+echarts+datav大屏数据展示及实现中国地图省市县下钻功能
2020/11/16 Javascript
Vue——解决报错 Computed property &quot;****&quot; was assigned to but it has no setter.
2020/12/19 Vue.js
[05:24]TI9采访——教练
2019/08/24 DOTA
对python中GUI,Label和Button的实例详解
2019/06/27 Python
pandas计算最大连续间隔的方法
2019/07/04 Python
微信小程序python用户认证的实现
2019/07/29 Python
Python基于execjs运行js过程解析
2020/11/27 Python
用纯CSS3实现网页中常见的小箭头
2017/10/16 HTML / CSS
美国购买汽车零件网站:Buy Auto Parts
2018/04/02 全球购物
法学毕业生自我鉴定
2014/01/31 职场文书
小班重阳节活动方案
2014/02/08 职场文书
《美丽的南沙群岛》教学反思
2014/04/27 职场文书
美术社团活动总结
2014/06/27 职场文书
乡镇干部个人对照检查材料(群众路线)
2014/09/26 职场文书
Django cookie和session的应用场景及如何使用
2021/04/29 Python
Python与C++中梯度方向直方图的实现
2022/03/17 Python
python数字图像处理之对比度与亮度调整示例
2022/06/28 Python