参考文档

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. [转帖]Tomcat maxKeepAliveRequests

    https://www.cnblogs.com/turn2i/p/10480088.html 在写这个问题前,其实我是为了分析项目碰到的一个tcp close wait问题.这个问题就不在这里讲了. ...

  2. css动画京东小布hover放大

    <style> .box { width: 183px; height: 130px; overflow: hidden; border: 1px solid pink; } div im ...

  3. String 中的Trim

    Trim 切除首尾指定字符 var newStr=""; char[] trimChars={'@','#','$',' '}; string strC="@Hello# ...

  4. 设计模式学习-使用go实现组合模式

    组合模式 定义 适用范围 优点 缺点 代码实现 参考 组合模式 定义 组合模式(Composite),将对象组合成树形结构以表示'部分-整体'的层次关系.组合模式使得用户对单个对象和组合对象的使用具有 ...

  5. SqlSugar分页查询

    同步分页  int pagenumber= 1; // pagenumber是从1开始的不是从零开始的  int pageSize = 20;  int totalCount=0;  //单表分页   ...

  6. Flask 实现文件上传下载

    Flask 针对文件的上传下载相关代码片段,多种方法,包括限制文件格式,大小等. 实现图片文件上传 # name: 简单的实现文件上传任务. import os from flask import F ...

  7. 【scikit-learn基础】--『回归模型评估』之损失分析

    分类模型评估中,通过各类损失(loss)函数的分析,可以衡量模型预测结果与真实值之间的差异.不同的损失函数可用于不同类型的分类问题,以便更好地评估模型的性能. 本篇将介绍分类模型评估中常用的几种损失计 ...

  8. SpringCloud-04-http客户端Feign

    http客户端Feign 1.Feign的介绍 Feign是一个声明式的http客户端,官方地址:https://github.com/OpenFeign/feign 其作用就是帮助我们优雅的实现ht ...

  9. PHP 编程技巧与优化

    PHP 编程技巧与优化 1. 尽量采用大量的PHP内置函数. 2. 使用echo代替print,并且使用echo的多重参数(译注:指用逗号而不是句点)代替字符串连接 3. 用单引号代替双引号来包含字符 ...

  10. ASP.NET Core分布式项目实战(第三方ClientCredential模式调用)--学习笔记

    任务10:第三方ClientCredential模式调用 创建一个控制台程序 dotnet new console --name ThirdPartyDemo 添加 Nuget 包:IdentityM ...