参考文档

https://urllib3.readthedocs.io/en/latest/reference/urllib3.util.html#module-urllib3.util.retry
https://blog.csdn.net/shengruxiahua2571/article/details/103165315/

了解

连接超时 ==> 发起请求连接到建立连接之间的最大时长
读取超时 ==> 连接成功开始到服务器返回响应之间等待的最大时长

代码示例

import traceback
import time
from urllib3.util.retry import Retry
from requests.adapters import HTTPAdapter
retries = Retry(total=3,
backoff_factor=0.1,
status_forcelist=[ 500, 502, 503, 504 ])
s = requests.Session()
s.mount('http://', HTTPAdapter(max_retries=retries))
s.mount('https://', HTTPAdapter(max_retries=retries))
count = 0
while True:
if count < 3:
try:
file = s.get(url, stream=True, timeout=5)
return file.content
except:
print('Retry!')
time.sleep(3)
traceback.print_exc()
count += 1
continue
else:
print('Fail!')
break # 相关Retry参数说明
total 允许的重试次数
connect 要重试的连接相关错误数
read 读取错误时重试多少次
redirect 要执行的重定向数
status_forcelist 一组我们应该强制重试的HTTP状态代码
backoff_factor 在第二次尝试后在尝试之间应用的退避因素(大多数错误会立即通过第二次尝试解决,没有延迟)
raise_on_redirect 如果重定向次数用尽,是否引发 MaxRetryError 或返回响应代码在 3xx 范围内的响应。
raise_on_status 类似于raise_on_redirect:如果状态在status_forcelist范围内并且重试已经用尽,我们是否应该引发异常或返回响应。

结合项目需求使用的两种方法

方法一,普通循环请求判断

    def connection_demo(self, request):
start_time = datetime.now()
while True:
... # 省略其它代码部分
num_times = 0
session = requests.Session() # 推荐使用session可以提高访问速度
while num_times < 3:
try:
result = session.get(url=url, verify=False, timeout=5)
if result.status_code == 200:
break
except requests.exceptions.RequestException: # 如果HTTP请求返回了不成功的状态码, Response.raise_for_status() 会抛出一个 HTTPError 异常
num_times += 1
continue
if num_times < 3:
break
else:
raise VtuneTimeOutException
... # 省略其它代码部分
return redirect_url

方法二,requests的retry

import requests
from urllib3.util.retry import Retry
from requests.adapters import HTTPAdapter def connection_demo(self, request):
start_time = datetime.now()
while True:
... # 省略其余代码部分
req = requests.Session()
retries = Retry(total=3,
backoff_factor=0.1,
status_forcelist=[500, 502, 503, 504])
req.mount('https://', HTTPAdapter(max_retries=retries))
try:
result = req.get(url=url, verify=False, timeout=5)
if result.status_code == 200:
break
else:
raise VtuneTimeOutException
except requests.exceptions.RequestException:
raise VtuneTimeOutException
... # 省略其余代码部分
return redirect_url

方法3,装饰器retry

pip install retry
自行百度

总结

需求是:后端视图代码请求由内部生成并存储到数据库中的一个url,看是否通再将url返回给前端,3次重连,根据requests的status_code为200来判断是否成功,
状态码200成功则结束,其它状态码不成功则继续,
并且在3次重连内,有超时等问题都不希望让其抛出错误,等3次重连结束后,再判断是否都不成功再抛出错误。使用第二种方法有点小bug,
具体还是要结合项目,之前没有加status_forcelist这个玩意,导致有一次请求得到503,页面报错了,但是因为有三次重连的机制,
报错了还继续执行成功了。所以后面加了status_forcelist,但是还有异常捕获的问题,因为只要有一次超时或其它问题,
都会被捕获抛异常,那样也会遇到报错了还继续执行成功了的问题。
所以我使用了第一种方式写法,当然了还是要结合项目需求来。

requests请求超时尝试重连的3种方式的更多相关文章

  1. Java设置session超时(失效)的三种方式

    1. 在web容器中设置(此处以tomcat为例) 在tomcat-6.0\conf\web.xml中设置,以下是tomcat 6.0中的默认配置: <!-- ================= ...

  2. 导致flash屏幕重绘的几种方式及避免重绘的方法

    导致屏幕重绘的几种原因: 1.最常见的是情况就是舞台上的可视组件在形状.位置.状态(alpha, scale…)发生改变的时候会触发Flash Player 的重绘. 2.当一个DisplayObje ...

  3. ASP.NET问题处理---“数据请求超时错误“”

    数据请求超时,一般有2中解决方式: 1.页面AJAX处理数据时延长时间: 2.后台数据库连接取数据时延长时间. 由于我的后台数据库连接取数据为循环读取数据,所以不存在超时问题,这里具体说说如何修改AJ ...

  4. 比较两种方式的form请求提交

    [一]浏览器form表单提交 表单提交, 适用于浏览器提交.像常见的pc端的网银支付,用户在商户商城购买商品,支付时商家系统把交易数据通过form表单提交到三方支付网关,然后用户在三方网关页面完成支付 ...

  5. Python爬虫requests判断请求超时并重新发送请求

     下面是简单的一个重复请求过程,更高级更简单的请移步本博客: https://www.cnblogs.com/fanjp666888/p/9796943.html  在爬虫的执行当中,总会遇到请求连接 ...

  6. python+requests 请求响应文本出错返回“登录超时”

    Python+requests请求响应:"msg":"登录过时" 1.出错原代码: import requests import json#页面按条件搜索返回相 ...

  7. Dubbo超时和重连机制

    dubbo启动时默认有重试机制和超时机制.超时机制的规则是如果在一定的时间内,provider没有返回,则认为本次调用失败,重试机制在出现调用失败时,会再次调用.如果在配置的调用次数内都失败,则认为此 ...

  8. python requests请求卡住问题

    最近经常接到别人反馈某个爬虫工具程序没有正常运行,需要下载的资讯数据也没有及时进行收录. 刚开始以为可能是机器的问题,偶尔机器会出现程序运行中途卡住的情况. 但随着异常的情况越来越频繁,我便只好去排查 ...

  9. HTTP 408请求超时错误解决办法

    错误描述 对于大多数网站而言,我们所看到的错误消息已经是开发者定制过的页面,比如我们最常见的自定义404错误页面,一般而言,我们看到的408错误应该是类似这样的提示:“408:Request Time ...

  10. SQL Server 磁盘请求超时的833错误原因分析以及解决

    本文出处:http://www.cnblogs.com/wy123/p/6984885.html 最近遇到一个SQL Server服务器响应极度缓慢,并且出现客户端请求报错的情况,在数据库中的erro ...

随机推荐

  1. [转帖]Sosreport:收集系统日志和诊断信息的工具

    https://zhuanlan.zhihu.com/p/39259107 如果你是 RHEL 管理员,你可能肯定听说过 Sosreport :一个可扩展.可移植的支持数据收集工具.它是一个从类 Un ...

  2. 【转帖】关于网卡特性TSO、UFO、GSO、LRO、GRO

    https://www.cnblogs.com/larrypeng/p/12496810.html 我们来看下关于网卡特性的解释,不过记住GSO和GRO两个特性就好. TSO(TCP Segmenta ...

  3. Ubuntu2204设置固定IP地址

    前言 Ubuntu每次升级都会修改一部分组件. 从1804开始Ubuntu开始使用netplan的方式进行网络设置. 但是不同版本的配置一直在升级与变化. 今天掉进坑里折腾了好久. 所以这边总结一下, ...

  4. UOS关闭激活提示: Your system is not activated. Please activate as soon as possible for normal use.

    最近公司里面进行UOS的兼容性验证,但是系统总是会提示: Your system is not activated. Please activate as soon as possible for n ...

  5. 一文搞懂Go GC演进史,讲的太细致了!

    最近在和 Go就业训练营 的朋友讨论Go GC的问题,发现了刘丹冰老师总结的内容,写的太好了,和大家分享一下. 我们的讨论和思考也整理到这篇文章中了,希望对你有启发. 垃圾回收(Garbage Col ...

  6. 程序调试利器——GDB使用指南

    作者:京东科技 孙晓军 # 1\. GDB介绍 GDB是GNU Debugger的简称,其作用是可以在程序运行时,检测程序正在做些什么.GDB程序自身是使用C和C++程序编写的,但可以支持除C和C++ ...

  7. 范德蒙德矩阵行列式 & 循环矩阵行列式的证明

    范德蒙德矩阵的行列式 \[\begin{vmatrix} 1 & 1 & 1 & \dots & 1 \\ x_1 & x_2 & x_3 & ...

  8. apb vnext DynamicCient

    1.在需要的服务客户端(xx.HttpApi.Client)Nuget 引用和模块依赖 引用:VOLO.APB.HTTP.CLENT [dependsOn(typeof(AbpHttpClientMo ...

  9. 【5】OpenCV2.4.9实现图像拼接与融合方法【SURF、SIFT、ORB、FAST、Harris角点 、stitch 】

    相关文章: [1]windows下安装OpenCV(4.3)+VS2017安装+opencv_contrib4.3.0配置 [2]Visual Studio 2017同时配置OpenCV2.4 以及O ...

  10. C/C++ 使用API实现数据压缩与解压缩

    在Windows编程中,经常会遇到需要对数据进行压缩和解压缩的情况,数据压缩是一种常见的优化手段,能够减小数据的存储空间并提高传输效率.Windows提供了这些API函数,本文将深入探讨使用Windo ...