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 相关文章推荐
pyramid配置session的方法教程
Nov 27 Python
Python中time模块与datetime模块在使用中的不同之处
Nov 24 Python
python中logging库的使用总结
Oct 18 Python
python将文本中的空格替换为换行的方法
Mar 19 Python
使用python语言,比较两个字符串是否相同的实例
Jun 29 Python
python创建文件备份的脚本
Sep 11 Python
详解opencv中画圆circle函数和椭圆ellipse函数
Dec 27 Python
python对Excel的读取的示例代码
Feb 14 Python
python用opencv完成图像分割并进行目标物的提取
May 25 Python
使用tensorflow根据输入更改tensor shape
Jun 23 Python
详解在Python中使用Torchmoji将文本转换为表情符号
Jul 27 Python
Python WSGI 规范简介
Apr 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
《被神捡到的男人》动画化计划进行中!
2020/03/06 日漫
一个程序下载的管理程序(二)
2006/10/09 PHP
PHP扩展模块Pecl、Pear以及Perl的区别
2014/04/09 PHP
php写一个函数,实现扫描并打印出自定目录下(含子目录)所有jpg文件名
2017/05/26 PHP
PHP如何防止XSS攻击与XSS攻击原理的讲解
2019/03/22 PHP
php根据地址获取百度地图经纬度的实例方法
2019/09/03 PHP
破解Session cookie的方法
2006/07/28 Javascript
W3C Group的JavaScript1.8 新特性介绍
2009/05/19 Javascript
用showModalDialog弹出页面后,提交表单总是弹出一个新窗口
2009/07/18 Javascript
jQuery第三课 修改元素属性及内容的代码
2010/03/14 Javascript
javascript操作cookie的文章(设置,删除cookies)
2010/04/01 Javascript
Date对象格式化函数代码
2010/07/17 Javascript
javascript实现上传图片并预览的效果实现代码
2011/04/11 Javascript
原生Ajax 和jQuery Ajax的区别示例分析
2014/12/17 Javascript
详解JavaScript中双等号引起的隐性类型转换
2016/05/30 Javascript
封装获取dom元素的简单实例
2016/07/08 Javascript
最细致的vue.js基础语法 值得收藏!
2016/11/03 Javascript
使用BootStrap实现标签切换原理解析
2017/03/14 Javascript
详谈jQuery中使用attr(), prop(), val()获取value的异同
2017/04/25 jQuery
vue-router 路由基础的详解
2017/10/17 Javascript
vue使用ajax获取后台数据进行显示的示例
2018/08/09 Javascript
深入理解JS异步编程-Promise
2019/06/03 Javascript
vue从零实现一个消息通知组件的方法详解
2020/03/16 Javascript
python写日志封装类实例
2015/06/28 Python
python实现爬虫下载美女图片
2015/07/14 Python
Python算法之图的遍历
2017/11/16 Python
python石头剪刀布小游戏(三局两胜制)
2021/01/20 Python
详解Numpy中的数组拼接、合并操作(concatenate, append, stack, hstack, vstack, r_, c_等)
2019/05/27 Python
使用pycharm在本地开发并实时同步到服务器
2019/08/02 Python
python能开发游戏吗
2020/06/11 Python
增大python字体的方法步骤
2020/07/05 Python
Pycharm创建python文件自动添加日期作者等信息(步骤详解)
2021/02/03 Python
办公室文员自荐书
2014/02/03 职场文书
党员批评与自我批评发言
2014/10/02 职场文书
2016春季小学开学寄语
2015/12/03 职场文书
HTML CSS 一个标签实现带动画的抖音LOGO
2022/04/26 HTML / CSS