0

0

requests 如何优雅处理 429 Too Many Requests 自动重试

舞姬之光

舞姬之光

发布时间:2026-01-24 17:58:02

|

694人浏览过

|

来源于php中文网

原创

requests需显式检查429状态码并解析Retry-After头:若为数字则转秒数,若为HTTP日期则计算差值,无此头时fallback至1秒;禁用urllib3默认退避,避免与Retry-After叠加。

requests 如何优雅处理 429 too many requests 自动重试

requests 怎么识别 429 并触发重试

requests 本身不自动重试 429,必须显式检查 response.status_code。常见错误是只捕获 requests.exceptions.ConnectionErrorTimeout,却忽略 429 是 HTTP 成功响应(状态码 429 属于 4xx,但请求已送达服务器并被明确拒绝)。response.headers 中的 Retry-After 字段才是关键信号——它可能返回秒数(如 "10")或 HTTP-date(如 "Wed, 21 Oct 2024 07:28:00 GMT"),必须解析后等待。

用 urllib3 的 Retry 配合 requests 处理 429

requests 底层用 urllib3,可通过 urllib3.util.Retry 注册自定义重试逻辑。但注意:默认 Retry 不包含 429,需手动添加到 status_forcelist;且必须禁用内置的退避逻辑(backoff_factor=0),否则会叠加 Retry-After 和指数退避,导致等待时间远超预期。

  • 设置 status_forcelist=(429,)
  • backoff_factor=0,避免干扰 Retry-After
  • 重试前手动读取 response.headers.get("Retry-After"),再调用 time.sleep()
  • 若无 Retry-After,fallback 到固定延迟(如 1 秒),防止无限循环

自己封装一个带 429 感知的 session

比改 urllib3 更直接:继承 requests.Session,重写 send() 方法,在收到 429 后提取 Retry-After、sleep、再重发。这样能完全控制流程,也方便注入日志或监控。

WeShop唯象
WeShop唯象

WeShop唯象是国内首款AI商拍工具,专注电商产品图片的智能生成。

下载
import time
from datetime import datetime
from requests import Session

class Retry429Session(Session): def send(self, request, kwargs): response = super().send(request, kwargs) if response.status_code == 429: retry_after = response.headers.get("Retry-After") wait = 1.0 if retry_after and retry_after.isdigit(): wait = float(retry_after) elif retry_after: try: dt = datetime.strptime(retry_after, "%a, %d %b %Y %H:%M:%S %Z") wait = (dt - datetime.utcnow()).total_seconds() wait = max(0, wait) except ValueError: pass time.sleep(wait) return self.send(request, **kwargs) # 递归重试 return response

为什么不能只靠 requests.adapters.HTTPAdapter 的 max_retries

HTTPAdaptermax_retries 默认只处理连接失败、超时、重定向循环等底层异常,对 429 这类“服务器明确拒绝”的响应完全静默。即使你传入 Retry(total=3, status_forcelist=[429]),它也不会读取 Retry-After,而是直接按指数退避等待(如 1s → 2s → 4s),和 API 提供的限流策略脱节。更危险的是:某些服务在 429 响应体里还带 {"error": "rate limit exceeded"},但 Retry 不解析 body,无法做额外判断(比如是否要降级请求频率)。

真正可靠的方案,永远是把 Retry-After 解析权握在自己手里——它才是服务端给你的唯一权威调度指令。

相关专题

更多
session失效的原因
session失效的原因

session失效的原因有会话超时、会话数量限制、会话完整性检查、服务器重启、浏览器或设备问题等等。详细介绍:1、会话超时:服务器为Session设置了一个默认的超时时间,当用户在一段时间内没有与服务器交互时,Session将自动失效;2、会话数量限制:服务器为每个用户的Session数量设置了一个限制,当用户创建的Session数量超过这个限制时,最新的会覆盖最早的等等。

314

2023.10.17

session失效解决方法
session失效解决方法

session失效通常是由于 session 的生存时间过期或者服务器关闭导致的。其解决办法:1、延长session的生存时间;2、使用持久化存储;3、使用cookie;4、异步更新session;5、使用会话管理中间件。

747

2023.10.18

cookie与session的区别
cookie与session的区别

本专题整合了cookie与session的区别和使用方法等相关内容,阅读专题下面的文章了解更详细的内容。

88

2025.08.19

scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

188

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

291

2023.10.25

http500解决方法
http500解决方法

http500解决方法有检查服务器日志、检查代码错误、检查服务器配置、检查文件和目录权限、检查资源不足、更新软件版本、重启服务器或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

392

2023.11.09

http请求415错误怎么解决
http请求415错误怎么解决

解决方法:1、检查请求头中的Content-Type;2、检查请求体中的数据格式;3、使用适当的编码格式;4、使用适当的请求方法;5、检查服务器端的支持情况。更多http请求415错误怎么解决的相关内容,可以阅读下面的文章。

416

2023.11.14

HTTP 503错误解决方法
HTTP 503错误解决方法

HTTP 503错误表示服务器暂时无法处理请求。想了解更多http错误代码的相关内容,可以阅读本专题下面的文章。

2079

2024.03.12

c++空格相关教程合集
c++空格相关教程合集

本专题整合了c++空格相关教程,阅读专题下面的文章了解更多详细内容。

0

2026.01.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Git 教程
Git 教程

共21课时 | 2.9万人学习

Git版本控制工具
Git版本控制工具

共8课时 | 1.5万人学习

Git中文开发手册
Git中文开发手册

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号