python對(duì)于requests的封裝方法詳解
由于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)起來(lái)并不是很理想,綜合考慮多進(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)來(lái)源于配置文件,方便不同測(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è)參考,也希望大家多多支持腳本之家。
- Python 面向?qū)ο笾庋b、繼承、多態(tài)操作實(shí)例分析
- Python面向?qū)ο笾惖姆庋b操作示例
- Python面向?qū)ο蟪绦蛟O(shè)計(jì)類的封裝與繼承用法示例
- Python面向?qū)ο蟪绦蛟O(shè)計(jì)中類的定義、實(shí)例化、封裝及私有變量/方法詳解
- python寫日志封裝類實(shí)例
- Python面向?qū)ο笾接袑傩院退接蟹椒☉?yīng)用案例分析
- Python面向?qū)ο笾^承原理與用法案例分析
- Python面向?qū)ο笾鄳B(tài)原理與用法案例分析
- python面向?qū)ο笾悓傩院皖惙椒ò咐治?/a>
- Python面向?qū)ο蠓庋b操作案例詳解
相關(guān)文章
matplotlib之pyplot模塊添加文本、注解(text和annotate)
matplotlib是python最著名的繪圖庫(kù),它提供了一整套和matlab相似的命令A(yù)PI,十分適合交互式地行制圖,下面這篇文章主要給大家介紹了關(guān)于matplotlib之pyplot模塊添加文本、注解(text和annotate)的相關(guān)資料,需要的朋友可以參考下2022-05-05用python實(shí)現(xiàn)各種數(shù)據(jù)結(jié)構(gòu)
這篇文章主要分享的是用python實(shí)現(xiàn)各種數(shù)據(jù)結(jié)構(gòu),快速排序、選擇排序、插入排序、歸并排序、堆排序heapq模塊等相關(guān)資料,感興趣的小伙伴可以參考一下2021-12-12使用pymysql查詢數(shù)據(jù)庫(kù),把結(jié)果保存為列表并獲取指定元素下標(biāo)實(shí)例
這篇文章主要介紹了使用pymysql查詢數(shù)據(jù)庫(kù),把結(jié)果保存為列表并獲取指定元素下標(biāo)實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2020-05-05Opencv中cv2.cvtColor彩色圖轉(zhuǎn)灰度圖的其他6種方法
本文主要介紹了Opencv中cv2.cvtColor彩色圖轉(zhuǎn)灰度圖的其他6種方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05python中的十大%占位符對(duì)應(yīng)的格式化的使用方法
本文主要介紹了python中的十大%占位符對(duì)應(yīng)的格式化的使用方法,它可以很好的幫助我們解決一些字符串格式化的問題, 文中通過示例代碼介紹的非常詳細(xì),感興趣的小伙伴們可以參考一下2022-01-01在python中實(shí)現(xiàn)求輸出1-3+5-7+9-......101的和
這篇文章主要介紹了在python中實(shí)現(xiàn)求輸出1-3+5-7+9-......101的和,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2020-04-04Python深度學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)基本原理
人工神經(jīng)網(wǎng)絡(luò)(Artificial Neural Networks,簡(jiǎn)寫為ANNs)也簡(jiǎn)稱為神經(jīng)網(wǎng)絡(luò)(NNs)或稱作連接模型(Connection Model),它是一種模仿動(dòng)物神經(jīng)網(wǎng)絡(luò)行為特征,進(jìn)行分布式并行信息處理的算法數(shù)學(xué)模型2021-10-10