编写装饰器实现python请求错误重试功能

在做接口自动化测试的时候,总会遇到,因连接超时等错误导致,接口脚本失败。

官方给出的方法:

max_retries=5 出错重试5次注意的是,这个只对DNS,连接错误进行重试。
    from requests.adapters import HTTPAdapter
    s = requests.Session()
    s.mount(‘http://‘,HTTPAdapter(max_retries=5))
    s.mount(‘https://‘,HTTPAdapter(max_retries=5))
    s.get(‘https://www.baidu.com‘)

自编写装饰器一

from requests.exceptions import ConnectionError
import requests
def retry(**kw):
    def war(func):
        def w(*args,**kwargs):
            try:
                ret = func(*args,**kwargs)
            except ConnectionError:
                kw[‘reNum‘] = int(kw[‘reNum‘]) - 1
                if kw[‘reNum‘] >=0:
                    print kw[‘reNum‘]
                    ret = w(*args,**kwargs)
                else:
                    ret = ConnectionError
            return ret
        return w
    return war

自编写装饰器二

from requests.exceptions import ConnectionError

def retry(**kw):
    def wrapper(func):
        def _wrapper(*args,**kwargs):
            raise_ex = None
            for _ in range(kw[‘reNum‘]):
                print _
                try:
                    return func(*args,**kwargs)
                except ConnectionError as ex:
                    raise_ex = ex
            #raise raise_ex
        return _wrapper
    return wrapper

使用方法:reNum = 5 代表,出现ConnectionError时最多可重试5次。

@retry(reNum=5)
def demo():
    raise ConnectionError

总结:

1.编写装饰器,其实没有那么难,只要掌握方法。 这个可以参考,我之前写的关于装饰器的文章

2.装饰器的通熟解释,就是在函数之前后之后做点什么。通过这个我们可以做很多。

3.关于请求连接错误,重试,装饰器;原理就是做一个循环,只要捕获到有ConnectionError 错误,就进入下一次循环

调用;只要有正确的时候,直接返回函数。

qq技术交流群,期待你的加入:

python|测试|技术交流群:563227894

python|测试|技术交流群:563227894

python|测试|技术交流群:563227894

原文地址:https://www.cnblogs.com/yhleng/p/9273075.html

时间: 2024-08-02 22:11:15

编写装饰器实现python请求错误重试功能的相关文章

Python(74)_编写装饰器,为多个函数加上记录调用功能,要求每次调用函数都将被调用的函数名写入文件

#-*-coding:utf-8-*- import os import time from functools import wraps ''' 1.编写装饰器,为多个函数加上记录调用功能,要求每次调用函数都将被调用的函数名写入文件 ''' def log(func): def inner(*args,**kwargs): with open('log1.txt','a',encoding='utf-8') as f: f.write(func.__name__+'\n') ret = fun

Atitit php java python nodejs错误日志功能的比较

Atitit php  java  python  nodejs错误日志功能的比较 1.1. Php方案 自带 1 1.2. Java解决方案 SLF4J 1 1.3. Python解决方案 自带loggin 2 1.4. Node.js日志解决方案 log4js 2 1.4.1. 玩转Nodejs日志管理log4js - CNode技术社区 2 日志的俩中模式   文件日志与os event 日志.. Os日志的优点是格式整齐.以及有默认os工具gui故居查询等.. 1.1. Php方案 自带

Flask10 登录模块、表单框架、表单渲染、表单验证、bookie、请求之前钩子、g对象、编写装饰器

from flask import Flask from flask import request from flask import render_template from flask_wtf import CSRFProtect as WTF # 利用表单类去渲染模板时需要用到 from forms import LoginForm app = Flask(__name__) WTF(app) # 在app上注册一个 WTF (所有的flask插件都必须进行注册) app.config.f

python 之装饰器(用装饰器给现有函数增加新功能)

#!/usr/bin/env python # -*- coding: utf-8 -*- """ Created on Mon Nov 14 01:01:29 2016 @author: toby """ #知识点:装饰器 ''' #一.小粒子: #要求1.假如产品经历要求在每个函数之上执行之前都添加一个验证的功能,当然这里只是模拟而已,别当真哈! #已写好的现有函数如下,有1000个函数 def func1():     print 'fun

<每日一题>题目2:编写装饰器,为多个函数加上认证功能(用户账号和密码来源于文件)

这里做个最简单的账号密码验证,主要为了实现装饰器同时对多个函数起作用 1 FLAG = False #加一个变量防止多次登录验证 2 def wrapper(f): 3 def inner(*args,**kwargs): 4 '''登录程序''' 5 global FLAG #将FLAG变量设置成全局变量 6 if FLAG: 7 ret = f(*args, **kwargs) 8 return ret 9 else: 10 username = input('username:') 11

02python 装饰器(python函数)

装饰器的形成过程 import time def func(): # 定义一个函数 time.sleep(0.01) print('hello world!') def timer(f): # 一个闭包函数,接收一个函数,也叫做装饰器函数 def inner(): start = time.time() f() # 被装饰函数 end = time.time() print(end - start) return inner func = timer(func) func() 20 1 impo

Django中间件,csrf校验和装饰器以及auth模块和部分功能

一.Django中间件 1).什么是中间件 官方的说法:中间件是一个用来处理Django的请求和响应的框架级别的钩子.它是一个轻量.低级别的插件系统,用于在全局范围内改变Django的输入和输出.每个中间件组件都负责做一些特定的功能. 但是由于其影响的是全局,所以需要谨慎使用,使用不当会影响性能. 说的直白一点中间件是帮助我们在视图函数执行之前和执行之后都可以做一些额外的操作,它本质上就是一个自定义类,类中定义了几个方法,Django框架会在请求的特定的时间去执行这些方法. 我们一直都在使用中间

(转)实现一个cache装饰器,实现过期可清除功能

原文:http://www.cnblogs.com/JerryZao/p/9574927.html http://blog.51cto.com/11281400/2107790-----装饰器应用练习 文件私聊下载 灵感来自 from functools import lru_cache 的源代码,_make_key 1 ''' 实现一个cache 装饰器,实现可过期被清除的功能''' 2 3 # 第一步,实现了 与参数输入不同,也就是说,传入值后, 4 # 不管什么样子,只要传入的顺序一样,结

编写装饰器,实现初始化协程函数的功能

def init(func): #初始化 def wrapper(*args,**kwargs): g=func(*args,**kwargs) next(g) return g return wrapper @init def eater(name): print('%s 准备开始吃饭啦' %name) food_list=[] while True: food=yield food_list print('%s 吃了 %s' % (name,food)) food_list.append(f