前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >python重试装饰器(Python function retry decorator)

python重试装饰器(Python function retry decorator)

作者头像
py3study
发布于 2020-03-12 12:28:01
发布于 2020-03-12 12:28:01
5.1K00
代码可运行
举报
文章被收录于专栏:python3python3
运行总次数:0
代码可运行

python重试装饰器(Python function retry decorator)

在用requests请求接口或者html的时候,很容易出现超时,限制等各种原因。

在对源代码不进行修改的情况下,可以用装饰器来进行重试

任何函数: 成功,返回-结果,失败,返回--False 都可以用这个装饰器进行重试

1.不需要传参的装饰器写法:

max_retry 为默认重试的次数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import requests


def retry(func):
    def inner(*args, **kwargs):
        ret = func(*args, **kwargs)
        max_retry = 3
        number = 0
        if not ret:
            while number < max_retry:
                number += 1
                print("尝试第:{}次".format(number))
                result = func(*args, **kwargs)
                if result:
                    break
    return inner


@retry
def get_reponse():
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36'
    }
    url = 'https://www.baidu.com'
    try:
        r = requests.get(url=url, headers=headers, timeout=0.01)
        if r.status_code == 200:
            print(r.headers)
            return r.headers
    except requests.exceptions.ReadTimeout:
        return False
    except requests.exceptions.ConnectTimeout:
        return False
    except Exception:
        return False

get_reponse()

执行结果:

尝试第:1次

尝试第:2次

尝试第:3次

2.需要传参的装饰器写法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def retry(*args, **kwargs):
    def warpp(func):
        def inner():
            ret = func()
            max_retry = kwargs.get('max_retry')
            # 不传默认重试3if not max_retry:
                max_retry = 3
            number = 0
            if not ret:
                while number < max_retry:
                    number += 1
                    print("尝试第:{}次".format(number))
                    result = func()
                    if result:
                        break
        return inner
    return warpp


@retry(max_retry=5)  # 不传默认为3次  @retry() 括号需要带
def get_reponse():
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36'
    }
    url = 'https://www.baidu.com'
    try:
        r = requests.get(url=url, headers=headers, timeout=0.01)
        if r.status_code == 200:
            print(r.headers)
            return r.headers
    except requests.exceptions.ReadTimeout:
        return False
    except requests.exceptions.ConnectTimeout:
        return False
    except Exception:
        return False

get_reponse()

执行结果:

尝试第:1次

尝试第:2次

尝试第:3次

尝试第:4次

尝试第:5次

3. 装饰器在类的用法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import requests

class Test:
    def retry(*args, **kwargs):
        def warpp(func):
            def inner(self, *args, **kwargs):
                ret = func(self, *args, **kwargs)
                max_retry = kwargs.get('max_retry')
                # 不传默认重试3if not max_retry:
                    max_retry = 3
                number = 0
                if not ret:
                    while number < max_retry:
                        number += 1
                        print("尝试第:{}次".format(number))
                        result = func(self, *args, **kwargs)
                        if result:
                            break
            return inner
        return warpp

    @retry()
    def get_reponse(self, url):
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36'
        }
        try:
            r = requests.get(url=url, headers=headers, timeout=0.01)
            if r.status_code == 200:
                print(r.headers)
                return r.headers
        except requests.exceptions.ReadTimeout:
            return False
        except requests.exceptions.ConnectTimeout:
            return False
        except Exception:
            return False


if __name__ == '__main__':
    st = Test()
    url = 'https://www.baidu.com'
    st.get_reponse(url)

运行结果:

尝试第:1次

尝试第:2次

尝试第:3次

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/03/11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
开源项目 requests 的 stars 为啥比 python 还多 3.7k?
结合上一篇文章《一次算法读图超时引起的urllib3源码分析》,我们学习了 urllib3 的基本语法、常见姿势和请求管理模式,以及PoolManager、HTTPConnectionPool、HTTPConnection等模块部分源码。对于学习 Python 的小伙伴来说,urllib3 强大的功能几乎能实现所有 HTTP 请求场景,但这就足够了吗?
程序员荒生
2022/03/15
8030
开源项目 requests 的 stars 为啥比 python 还多 3.7k?
requests-html HTTPSConnectionPool
HTTPSConnectionPool(host='hk.zaful.com', port=443): Read timed out. (read timeout=0.1)
py3study
2020/01/06
6570
python3的request用法实例
requests 是爬取数据最常用的模块,比起 urllib, urllib2, urllib3 这几个单是看名字就晕的模块,requests 不仅功能强大,而且 api 简单易用,使用起来有如丝般顺滑
章鱼喵
2019/08/24
2.8K0
多线程爬虫使用代理IP指南
多线程爬虫能有效提高工作效率,如果配合代理IP爬虫效率更上一层楼。作为常年使用爬虫做项目的人来说,选择优质的IP池子尤为重要,之前我讲过如果获取免费的代理ip搭建自己IP池,虽然免费但是IP可用率极低。
华科云商小徐
2025/06/04
310
为什么说每个爬虫工程师都要掌握 retry 装饰器
今天介绍一个实用的 python 库:retrying,它通过装饰器方法 retry 抽象出业务无关的重试机制实现,可以快速引入我们的工程中提高代码的健壮性和鲁棒性。
月小水长
2024/12/23
1600
Requests库详解
requests(爬虫系列之一) 由于最近工作中,与同事对接模拟手机浏览器进行广告模拟跳转。又一次接触用到爬虫的知识,以前用过urllib + bs4 + selenium定向爬取网易一元夺宝的商品信息保存在数据库中,当时,还是太年轻,对爬虫不是很了解,对爬虫的robots协议也不知道。现在重新梳理一下爬虫的知识。争取写一个系列,大致内容顺序是requests, bs4,re, scrapy, selenium等。 在介绍requests库之前,先介绍以下基本的http概念, 下面内容是在上嵩天教授课程
若与
2018/04/25
2K1
Requests库详解
漫漫人生路总会错几步python之retry
如果自动化中失败了一次,我们给机会了,成功了就既往不咎。只能说明不够稳定。那么retry该如何写呢?
赵云龙龙
2019/07/11
7300
漫漫人生路总会错几步python之retry
再谈装饰器
昨天我分享了装饰器的使用方法,发现看的人并不多,这也正常,毕竟装饰器是一种锦上添花的东西,没有它,无法稍微麻烦点,但还是可以凑合着过的。
somenzz
2020/11/25
4070
HTTP协议栈远程代码执行漏洞(CVE-2022-21907)复现
HTTP协议堆栈中存在远程代码执行漏洞,由于HTTP协议栈(HTTP.sys)中的HTTP Trailer Support功能存在边界错误可导致缓冲区溢出。
洛米唯熊
2022/01/23
2.3K0
requests-代理设置,超时设置,登陆验证,Prepared Requests
对于某些网站,大规模频繁请求,网站可能会弹出验证码,或者跳转到登陆认证页面,甚至可能会被直接封客户端ip,导致短时间内无法访问,这个时候就需要用到代理ip。
py3study
2020/02/10
2.8K0
python语言中的AOP利器:装饰器
一、前言 面向切面编程(AOP)是一种编程思想,与OOP并不矛盾,只是它们的关注点相同。面向对象的目的在于抽象和管理,而面向切面的目的在于解耦和复用。 举两个大家都接触过的AOP的例子: 1)java中mybatis的@Transactional注解,大家知道被这个注解注释的函数立即就能获得DB的事务能力。 2)python中的with threading.Lock(),大家知道,被这个with代码块包裹的部分立即获得同步的锁机制。 这样我们把事务和加锁这两种与业务无关的逻辑抽象出来,在逻辑上解耦,并且可以
用户1225216
2018/03/29
2.2K0
python接口自动化29-requests超时重试方法
“由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败”,这是经常遇到的问题 requests.exceptions.ConnectionError: HTTPSConnectionPool(host=’www.github.com’, port=443): Max retries exceeded with url: / (Caused by NewConnectionError(‘<urllib3.connection.verifiedhttpsconnection object="" at="" 0x0000020f06524ac8="">: Failed to establish a new connection: [WinError 10060] 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。’,)) 一般出现这个问题的原因是:host=’www.github.com’ 主机地址没连上,使用 requests 发请求时,有些网站服务器不稳定,特别是国外的网站,经常会出现连接失败情况。 连接失败后,有时候会抛出上面异常,有时候会一直卡住,进入假死状态,没响应,也不会结束。</urllib3.connection.verifiedhttpsconnection>
上海-悠悠
2020/05/29
5.7K0
Python函数超时,用装饰器解决
我们在自定义一个函数后,会调用这个函数来完成我们想要的功能。 就拿爬虫来举例,你发送请求,服务器给你响应,但是有可能服务器没有给你任何数据,无论是他识别了爬虫、还是服务器繁忙什么原因,这个时候,你的爬虫就会一直等待响应,这个时候就会非常浪费资源,还会造成程序阻塞。
小歪
2018/07/25
2.5K0
Python函数超时,用装饰器解决
懒人必备,五个高效Python装饰器
虽然我已经写了很多的代码,但除非绝对必要,我很少使用装饰器,比如使用@staticmethod装饰器来表示一个类中的静态方法。
数据STUDIO
2023/09/18
3810
Python 装饰器
概念:是一个闭包,把一个函数作为参数然后返回一个替代版的函数,本质上是一个返回函数的函数
星哥玩云
2022/09/08
3300
一日一技:方法不对,代码翻倍。Requests如何正确重试?
我们在做Python开发时,经常使用一些第三方库,这些库很多年来持续添加了新功能。但我发现很多同学在使用这些第三方库时,根本不会使用新的功能。他们的代码跟几年前没有任何区别。
青南
2023/08/21
7550
一日一技:方法不对,代码翻倍。Requests如何正确重试?
python模块之requests及应用
Python标准库中提供了:urllib、urllib2、httplib等模块以供Http请求,但是,它的 API 太渣了。它是为另一个时代、另一个互联网所创建的。它需要巨量的工作,甚至包括各种方法覆盖,来完成最简单的任务。
菲宇
2019/06/12
1.6K0
python模块之requests及应用
Python装饰器怎么做重试机制
重试机制在编程中是比较常见的场景,主要被用于处理那些可能由于临时性故障或网络波动等原因而失败的操作。
阿珍
2024/07/12
1240
Python装饰器怎么做重试机制
python使用retrying重试请求
当我们用 request 发起网络请求,时不时会遇到超时,当然不可能让这个请求一直阻塞,一般会设置一个超时时间,用 try except 抛出异常,避免程序中断。可如果一次超时就放弃该请求,误杀的概率会很大,我们日常访问某网站时,有打不开的情况都会多刷新几次。因此,我们也需要让 python 进行重试。而 retrying 模块应运而生
章鱼喵
2019/08/24
1.3K0
10个简单但很有用的Python装饰器
装饰器(Decorators)是Python中一种强大而灵活的功能,用于修改或增强函数或类的行为。装饰器本质上是一个函数,它接受另一个函数或类作为参数,并返回一个新的函数或类。它们通常用于在不修改原始代码的情况下添加额外的功能或功能。
deephub
2023/08/30
3150
10个简单但很有用的Python装饰器
推荐阅读
相关推荐
开源项目 requests 的 stars 为啥比 python 还多 3.7k?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验