python對于requests的封裝方法詳解
由于requests是http類接口的核心,因此封裝前考慮問題比較多:
1. 對多種接口類型的支持;
2. 連接異常時能夠重連;
3. 并發(fā)處理的選擇;
4. 使用方便,容易維護(hù);
當(dāng)前并未全部實(shí)現(xiàn),后期會不斷完善。重點(diǎn)提一下并發(fā)處理的選擇:python的并發(fā)處理機(jī)制由于存在GIL的原因,實(shí)現(xiàn)起來并不是很理想,綜合考慮多進(jìn)程、多線程、協(xié)程,在不考慮大并發(fā)性能測試的前提下使用了多線程-線程池的形式實(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類
使用方法:
作者: 郭可昌
作成時間: 20180224
更新內(nèi)容:
更新時間:
'''
class Requests(object):
def __init__(self):
self.session = requests.session()
self.header = {}
# URL默認(rèn)來源于配置文件,方便不同測試環(huán)境的切換,也可以動態(tài)設(shè)定
self.URL = Config().getURL()
# 默認(rèn)60s,可以動態(tài)設(shè)定
self.timeout = 60
#http連接異常的場合,重新連接的次數(shù),默認(rèn)為3,可以動態(tài)設(shè)定
self.iRetryNum = 3
self.errorMsg = ""
# 內(nèi)容 = {用例編號:響應(yīng)數(shù)據(jù)}
self.responses = {}
# 內(nèi)容 = {用例編號:異常信息}
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
# 復(fù)數(shù)請求并發(fā)處理,采用線程池的形式,用例數(shù)>線程池的容量:線程池的容量為并發(fā)數(shù),否則,用例數(shù)為并發(fā)數(shù)
# dicDatas: {用例編號:用例數(shù)據(jù)}
@decoLOG
def req_all(self, dicDatas, iThreadNum=5):
if len(dict(dicDatas)) < 1:
Log().logger.error("沒有測試對象,請確認(rèn)后再嘗試。。。")
return self.responses.clear()
# 請求用例集合轉(zhuǎn)換(用例編號,用例數(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)
# 返回所有請求的響應(yīng)信息({用例編號:響應(yīng)數(shù)據(jù)}),http連接異常:對應(yīng)None
return self.responses
# 用于單用例提交,http連接失敗可以重新連接,最大重新連接數(shù)可以動態(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ù)時進(jìn)行,未達(dá)到最大連接次數(shù),異常信息為空
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
# 未達(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請求異常,異常信息:%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對于requests的封裝方法詳解就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
- Python 面向?qū)ο笾庋b、繼承、多態(tài)操作實(shí)例分析
- Python面向?qū)ο笾惖姆庋b操作示例
- Python面向?qū)ο蟪绦蛟O(shè)計類的封裝與繼承用法示例
- Python面向?qū)ο蟪绦蛟O(shè)計中類的定義、實(shí)例化、封裝及私有變量/方法詳解
- python寫日志封裝類實(shí)例
- Python面向?qū)ο笾接袑傩院退接蟹椒☉?yīng)用案例分析
- Python面向?qū)ο笾^承原理與用法案例分析
- Python面向?qū)ο笾鄳B(tài)原理與用法案例分析
- python面向?qū)ο笾悓傩院皖惙椒ò咐治?/a>
- Python面向?qū)ο蠓庋b操作案例詳解
相關(guān)文章
python實(shí)現(xiàn)數(shù)組平移K位問題
這篇文章主要介紹了python實(shí)現(xiàn)數(shù)組平移K位問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-02-02
在Python反編譯中批量pyc轉(zhuǎn)?py的實(shí)現(xiàn)代碼
這篇文章主要介紹了在Python反編譯中批量pyc轉(zhuǎn)?py的實(shí)現(xiàn)代碼,代碼簡單易懂,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-02-02
Selenium 模擬瀏覽器動態(tài)加載頁面的實(shí)現(xiàn)方法
這篇文章主要介紹了Selenium 模擬瀏覽器動態(tài)加載頁面的實(shí)現(xiàn)方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-05-05
python pygame實(shí)現(xiàn)球球大作戰(zhàn)
這篇文章主要為大家詳細(xì)介紹了Python pygame實(shí)現(xiàn)球球大作戰(zhàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-11-11
pytorch 數(shù)據(jù)預(yù)加載的實(shí)現(xiàn)示例
在PyTorch中,數(shù)據(jù)加載和預(yù)處理是深度學(xué)習(xí)中非常重要的一部分,本文主要介紹了pytorch 數(shù)據(jù)預(yù)加載的實(shí)現(xiàn)示例,具有一定的參考價值,感興趣的可以了解一下2023-12-12
python中創(chuàng)建以及刪除虛擬環(huán)境的幾種方法總結(jié)
在Python?中創(chuàng)建虛擬環(huán)境非常容易,但是刪除虛擬環(huán)境可能會有一些挑戰(zhàn),這篇文章主要給大家介紹了關(guān)于python中創(chuàng)建以及刪除虛擬環(huán)境的幾種方法,需要的朋友可以參考下2024-03-03
基于python純函數(shù)實(shí)現(xiàn)井字棋游戲
這篇文章主要介紹了基于python純函數(shù)實(shí)現(xiàn)井字棋游戲,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-05-05

