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 相关文章推荐
wxpython学习笔记(推荐查看)
Jun 09 Python
python爬虫入门教程--优雅的HTTP库requests(二)
May 25 Python
Python 类的特殊成员解析
Jun 20 Python
PyCharm设置护眼背景色的方法
Oct 29 Python
python async with和async for的使用
Jun 20 Python
Python中使用双下划线防止类属性被覆盖问题
Jun 27 Python
Python人工智能之路 jieba gensim 最好别分家之最简单的相似度实现
Aug 13 Python
简单易懂Pytorch实战实例VGG深度网络
Aug 27 Python
Python collections模块使用方法详解
Aug 28 Python
Pandas时间序列重采样(resample)方法中closed、label的作用详解
Dec 10 Python
Pytest中conftest.py的用法
Jun 27 Python
python中if和elif的区别介绍
Nov 07 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面向对象全攻略 (一) 面向对象基础知识
2009/09/30 PHP
Laravel框架中Blade模板的用法示例
2017/08/30 PHP
thinkphp5 migrate数据库迁移工具
2018/02/20 PHP
php 字符串中是否包含指定字符串的多种方法
2018/04/12 PHP
地址栏传递中文参数乱码在js里用escape转码
2013/08/28 Javascript
js导出table到excel同时兼容FF和IE示例
2013/09/03 Javascript
JS事件在IE与FF中的区别详细解析
2013/11/20 Javascript
javascript中加号(+)操作符的一些神奇作用
2014/06/06 Javascript
jQuery实现菜单式图片滑动切换
2015/03/14 Javascript
js验证真实姓名与身份证号是否匹配
2015/10/13 Javascript
基于jQuery插件实现点击小图显示大图效果
2016/05/11 Javascript
Angularjs的ng-repeat中去除重复数据的方法
2016/08/05 Javascript
Javascript使用uploadify来实现多文件上传
2016/11/16 Javascript
基于JS实现限时抢购倒计时间表代码
2017/05/09 Javascript
剖析Angular Component的源码示例
2018/03/23 Javascript
webstrom Debug 调试vue项目的方法步骤
2018/07/17 Javascript
详解Jest结合Vue-test-utils使用的初步实践
2019/06/27 Javascript
Vue项目环境搭建详细总结
2019/09/26 Javascript
基于Vue中使用节流Lodash throttle详解
2019/10/30 Javascript
three.js 利用uv和ThreeBSP制作一个快递柜功能
2020/08/18 Javascript
[02:43]DOTA2英雄基础教程 圣堂刺客
2013/12/09 DOTA
windows下python安装paramiko模块和pycrypto模块(简单三步)
2017/07/06 Python
Python编程之string相关操作实例详解
2017/07/22 Python
基于python实现从尾到头打印链表
2019/11/02 Python
python如何查看网页代码
2020/06/07 Python
Python jieba库分词模式实例用法
2021/01/13 Python
css3背景_动力节点Java学院整理
2017/07/11 HTML / CSS
美国帽子俱乐部商店:Hat Club
2019/07/05 全球购物
主键(Primary Key)约束和唯一性(UNIQUE)约束的区别
2013/05/29 面试题
酒店led欢迎词
2014/01/09 职场文书
高二学生评语大全
2014/04/25 职场文书
校园学雷锋广播稿
2014/10/08 职场文书
2015年领导班子工作总结
2015/05/23 职场文书
2016年清明节寄语
2015/12/04 职场文书
幼儿园教师心得体会范文
2016/01/21 职场文书
python中super()函数的理解与基本使用
2021/08/30 Python