最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python對(duì)于requests的封裝方法詳解

 更新時(shí)間:2019年01月03日 09:11:42   作者:可昌  
今天小編就為大家分享一篇python對(duì)于requests的封裝方法詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧

由于requests是http類接口的核心,因此封裝前考慮問題比較多:

1. 對(duì)多種接口類型的支持;

2. 連接異常時(shí)能夠重連;

3. 并發(fā)處理的選擇;

4. 使用方便,容易維護(hù);

當(dāng)前并未全部實(shí)現(xiàn),后期會(huì)不斷完善。重點(diǎn)提一下并發(fā)處理的選擇:python的并發(fā)處理機(jī)制由于存在GIL的原因,實(shí)現(xiàn)起來并不是很理想,綜合考慮多進(jìn)程、多線程、協(xié)程,在不考慮大并發(fā)性能測(cè)試的前提下使用了多線程-線程池的形式實(shí)現(xiàn)。使用的是

concurrent.futures模塊。當(dāng)前僅方便支持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類
  使用方法: 
  作者:   郭可昌
  作成時(shí)間: 20180224
  更新內(nèi)容:
  更新時(shí)間:
'''
class Requests(object):
  def __init__(self):
    self.session = requests.session()
    self.header = {}
    # URL默認(rèn)來源于配置文件,方便不同測(cè)試環(huán)境的切換,也可以動(dòng)態(tài)設(shè)定
    self.URL = Config().getURL()
    # 默認(rèn)60s,可以動(dòng)態(tài)設(shè)定
    self.timeout = 60
    #http連接異常的場(chǎng)合,重新連接的次數(shù),默認(rèn)為3,可以動(dòng)態(tài)設(shè)定
    self.iRetryNum = 3
 
    self.errorMsg = ""
    # 內(nèi)容 = {用例編號(hào):響應(yīng)數(shù)據(jù)}
    self.responses = {}
    # 內(nèi)容 = {用例編號(hào):異常信息}
    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請(qǐng)求異常,異常信息:%s" % self.errorMsg)
    return response
 
 
  # 復(fù)數(shù)請(qǐng)求并發(fā)處理,采用線程池的形式,用例數(shù)>線程池的容量:線程池的容量為并發(fā)數(shù),否則,用例數(shù)為并發(fā)數(shù)
  # dicDatas: {用例編號(hào):用例數(shù)據(jù)}
  @decoLOG
  def req_all(self, dicDatas, iThreadNum=5):
 
    if len(dict(dicDatas)) < 1:
      Log().logger.error("沒有測(cè)試對(duì)象,請(qǐng)確認(rèn)后再嘗試。。。")
      return self.responses.clear()
 
    # 請(qǐng)求用例集合轉(zhuǎn)換(用例編號(hào),用例數(shù)據(jù))
    seed = [i for i in dicDatas.items()]
    self.responses.clear()
 
    # 線程池并發(fā)執(zhí)行,iThreadNum為并發(fā)數(shù)
    with ThreadPoolExecutor(iThreadNum) as executor:
      executor.map(self.req_single,seed)
 
    # 返回所有請(qǐng)求的響應(yīng)信息({用例編號(hào):響應(yīng)數(shù)據(jù)}),http連接異常:對(duì)應(yīng)None
    return self.responses
 
  # 用于單用例提交,http連接失敗可以重新連接,最大重新連接數(shù)可以動(dòng)態(tài)設(shè)定
  def req_single(self, listData, reqType="post", iLoop=1):
    response = None
    # 如果達(dá)到最大重連次數(shù),連接后提交結(jié)束
    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:
          # 異常信息保存只在最大連接次數(shù)時(shí)進(jìn)行,未達(dá)到最大連接次數(shù),異常信息為空
          self.resErr[listData[0]] = str(e)
          Log().logger.error("HTTP請(qǐng)求異常,異常信息:%s【%d】" % (str(e), iLoop))
 
        self.responses[listData[0]] = response
      else:
        # for future: other request method expand
        pass
    # 未達(dá)到最大連接數(shù),如果出現(xiàn)異常,則重新連接嘗試
    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請(qǐng)求異常,異常信息:%s【%d】" % (str(e), iLoop))
          # 重連次數(shù)遞增
          iLoop += 1
          # 進(jìn)行重新連接
          self.req_single(listData, reqType, iLoop)
          # 當(dāng)前連接終止
          return None
        self.responses[listData[0]] = response
      else:
        # for future: other request method expand
        pass
 
  # 設(shè)定SoapAction, 快捷完成webservice接口header設(shè)定
  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對(duì)于requests的封裝方法詳解就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • python實(shí)現(xiàn)數(shù)組平移K位問題

    python實(shí)現(xiàn)數(shù)組平移K位問題

    這篇文章主要介紹了python實(shí)現(xiàn)數(shù)組平移K位問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • python GUI圖形化編程wxpython的使用

    python GUI圖形化編程wxpython的使用

    這篇文章主要介紹了python GUI圖形化編程wxpython的使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • 在Python反編譯中批量pyc轉(zhuǎn)?py的實(shí)現(xiàn)代碼

    在Python反編譯中批量pyc轉(zhuǎn)?py的實(shí)現(xiàn)代碼

    這篇文章主要介紹了在Python反編譯中批量pyc轉(zhuǎn)?py的實(shí)現(xiàn)代碼,代碼簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-02-02
  • Python高級(jí)特性與幾種函數(shù)的講解

    Python高級(jí)特性與幾種函數(shù)的講解

    今天小編就為大家分享一篇關(guān)于Python高級(jí)特性與幾種函數(shù)的講解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • Selenium 模擬瀏覽器動(dòng)態(tài)加載頁面的實(shí)現(xiàn)方法

    Selenium 模擬瀏覽器動(dòng)態(tài)加載頁面的實(shí)現(xiàn)方法

    這篇文章主要介紹了Selenium 模擬瀏覽器動(dòng)態(tài)加載頁面的實(shí)現(xiàn)方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-05-05
  • python pygame實(shí)現(xiàn)球球大作戰(zhàn)

    python pygame實(shí)現(xiàn)球球大作戰(zhàn)

    這篇文章主要為大家詳細(xì)介紹了Python pygame實(shí)現(xiàn)球球大作戰(zhàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • pytorch 數(shù)據(jù)預(yù)加載的實(shí)現(xiàn)示例

    pytorch 數(shù)據(jù)預(yù)加載的實(shí)現(xiàn)示例

    在PyTorch中,數(shù)據(jù)加載和預(yù)處理是深度學(xué)習(xí)中非常重要的一部分,本文主要介紹了pytorch 數(shù)據(jù)預(yù)加載的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-12-12
  • python中創(chuàng)建以及刪除虛擬環(huán)境的幾種方法總結(jié)

    python中創(chuàng)建以及刪除虛擬環(huán)境的幾種方法總結(jié)

    在Python?中創(chuàng)建虛擬環(huán)境非常容易,但是刪除虛擬環(huán)境可能會(huì)有一些挑戰(zhàn),這篇文章主要給大家介紹了關(guān)于python中創(chuàng)建以及刪除虛擬環(huán)境的幾種方法,需要的朋友可以參考下
    2024-03-03
  • 基于python純函數(shù)實(shí)現(xiàn)井字棋游戲

    基于python純函數(shù)實(shí)現(xiàn)井字棋游戲

    這篇文章主要介紹了基于python純函數(shù)實(shí)現(xiàn)井字棋游戲,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05
  • python mysqldb連接數(shù)據(jù)庫

    python mysqldb連接數(shù)據(jù)庫

    今天無事想弄下python做個(gè)gui開發(fā),最近發(fā)布的是python 3k,用到了數(shù)據(jù)庫,通過搜索發(fā)現(xiàn)有一個(gè)mysqldb這樣的控件,可以使用,就去官方看了下結(jié)果,沒有2.6以上的版本
    2009-03-03

最新評(píng)論

隆林| 富裕县| 新巴尔虎右旗| 武宁县| 西和县| 新郑市| 河南省| 彭泽县| 青铜峡市| 安新县| 绩溪县| 贡山| 从江县| 阜阳市| 海宁市| 佛教| 峨边| 翁源县| 湖南省| 西昌市| 周口市| 孟州市| 双牌县| 墨江| 区。| 昌都县| 临安市| 涪陵区| 西贡区| 宿州市| 达孜县| 西乡县| 聊城市| 保靖县| 思茅市| 石屏县| 澄城县| 太康县| 阿拉善盟| 垦利县| 元朗区|