当Python请求库遇到重试限制时如何访问服务器响应

2024-03-16

我正在使用 Python requests 库来实现重试逻辑。这是我为重现我遇到的问题而制作的一个简单脚本。在重试次数用完的情况下,我希望能够记录来自服务器的至少一个响应以帮助调试。但是,我不清楚如何访问该信息。当然,我可以以其他方式实现重试来实现我的目标,但这似乎并不是什么边缘情况,我会惊讶地发现请求不支持我的用例。

我查看了 requests.packages.urllib3.exceptions.MaxRetryError 所包装的 requests.exceptions.RetryError 以及 requests.packages.urllib3.exceptions.ResponseError 所包装的所有内容均无济于事。

我错过了什么吗?

#!/usr/bin/env python

import requests
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util.retry import Retry
from requests.exceptions import RetryError


def main():
    retry_policy = Retry(
        total=3,
        status_forcelist=[418])

    session = requests.Session()
    session.mount('http://', HTTPAdapter(max_retries=retry_policy))

    try:
        session.get('http://httpbin.org/status/418')
    except RetryError as retry_error:
        print retry_error
        print retry_error.response is None


if __name__ == '__main__':
    main()

$ python 测试.py

HTTPConnectionPool(host='httpbin.org', port=80): Max retries exceeded with url: /status/418 (Caused by ResponseError('too many 418 error responses',))

True

查看 urllib3 源代码,我发现Retry对象采用一个名为的命名参数raise_on_status. True是默认值。当设置为False,遇到重试限制会导致返回响应而不是引发异常。下面的代码显示我造成了HTTPError(包含Response)通过使用抛出raise_for_status方法上的Response,但人们也可以轻松地使用Response直接地。

#!/usr/bin/env python

import requests
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util.retry import Retry
from requests.exceptions import HTTPError


def main():
    retry_policy = Retry(
        total=3,
        status_forcelist=[418],
        raise_on_status=False)

    session = requests.Session()
    session.mount('http://', HTTPAdapter(max_retries=retry_policy))

    try:
        response = session.get('http://httpbin.org/status/418')
        response.raise_for_status()
    except HTTPError as e:
        print e.response.status_code
        print e.response.content


if __name__ == '__main__':
    main()

$ python 测试.py

418

-=[ teapot ]=-

   _...._
 .'  _ _ `.
| ."` ^ `". _,
\_;`"---"`|//
  |       ;/
  \_     _/
    `"""`
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当Python请求库遇到重试限制时如何访问服务器响应 的相关文章

随机推荐

  • 无法在 Linux Mint 19.3 中安装 R 3.6.2 中的 httr 包

    我对 R 完全陌生 我尝试安装httr包裹 我首先安装了 pacman 然后尝试通过运行来加载 httrpacman p load httr 它没有成功 它在终端中显示以下消息 将包安装到 home 用户名 R x86 64 pc linu
  • hdfs 命令在 hadoop 中已弃用

    我正在关注这个程序 http www codeproject com Articles 757934 Apache Hadoop for Windows Platform YouTube 链接 https www youtube com w
  • 如何从文本框获取值

    我改变了我的问题 因为它可能不被理解 也对不起我的英语 动态创建文本框 将它们放入数组中 我的一段代码 public partial class NewArticleForm System Web UI Page private Label
  • 响应式 JavaScript:仅针对小设备宽度执行代码

    我有一些简单的 JavaScript 嵌入在事件中 我只想为小型设备触发它们 电话等 目前我正在做 if window width lt 606 do things 但这感觉很笨拙 有没有办法只对小于某个断点的设备执行此操作 除了设置较早的
  • 为什么在 asp.net 身份中验证电话号码后注销?

    我在我的项目中使用 asp net Identity 在VerifyPhoneNumber查看 当用户确认他的电话号码时 他已注销 AspNetApplicationCookie已移除 我从 资源 选项卡 检查 chrome 中检查了这一点
  • 对多个项目和配置有效使用 Visual Studio 项目属性

    我一直使用 Visual Studio 内置的 GUI 支持来配置我的项目 通常使用属性表 以便多个项目将使用通用集 我对此的主要抱怨之一是管理多个项目 配置和平台 如果您只是使用主 GUI 执行所有操作 右键单击项目 gt 属性 它很快就
  • 如何用 GridLayoutManager 从右到左填充 RecyclerView

    我正在尝试将一些数据填充到RecyclerView with GridLayoutManager GridLayoutManager layoutManager new GridLayoutManager this 3 GridLayout
  • Visual Studio 2012 包管理器控制台错误

    当尝试使用包管理器控制台安装任何内容时 我收到此错误 Install Package The schema version of Microsoft Bcl is incompatible with version 2 0 30625 90
  • Coq:添加“强归纳”策略

    对自然数的 强 或 完全 归纳意味着当证明 n 上的归纳步骤时 您可以假设该属性对于任何 k 都成立 Theorem strong induction forall P nat gt Prop forall n nat forall k n
  • 常规网络服务

    我尝试过使用http groovy codehaus org GroovyWS http groovy codehaus org GroovyWS 在我的 BuildConfig groovy 中 我添加了 compile org code
  • 使用YQL多查询&XPath解析HTML,如何转义嵌套引号?

    标题比它必须的更复杂 这是问题查询 SELECT FROM query multi WHERE queries SELECT FROM html WHERE url http www stumbleupon com url http www
  • PHP 动态调整图像大小与存储调整大小的图像

    我正在构建一个图像共享网站 想了解使用 PHP 动态调整图像大小并存储调整后的图像的优缺点 哪个更快 哪个更可靠 两种方法在速度和性能上差距有多大 请注意 无论哪种方式 图像都会通过 PHP 脚本进行统计 例如视图 或者是否允许热链接等 因
  • 在 Java 中创建一个填充随机整数的文本文件

    也许是个愚蠢的问题 但我尝试用 512 个整数填充一个空文本文件 每个整数在每个新行上 我能够将它们随机化并写入文件中 但它们创建了一大堆我想要的数字 谁能帮我纠正我的代码吗 import java io BufferedWriter im
  • iOS 版 QtCreator:如何使用我的应用程序部署 dylib 共享库

    我在 iOS 上部署动态共享库时遇到了困难 为了隔离和暴露问题 我有一个非常简单的 HelloWorld 项目 一个库导出类 其中包含返回 Hello World 的函数 以及一个使用该类并显示消息的程序 我正在使用 QtCreator 和
  • Pods.framework 为红色,在 DerivedData 中不存在

    我正在尝试使用 Cocoapods 0 39 0 作为我的项目的依赖项 我已按照步骤操作 但最终在我的项目中得到了红色的 Pods framework 如果我查看 XCode 7 2 1 所说的路径 它不存在 Users ajmas Lib
  • 使用 fillna 在 Pandas 中用列表填充空值

    Given a pd Series 我想用列表替换空值 也就是说 给定 import numpy as np import pandas as pd ser pd Series 0 1 np nan 我想要一个会返回的函数 0 0 1 1
  • Aurelia 自定义元素:访问父方法

    我正在使用 Aurelia 的自定义元素重复一组条目 这是示例要点 https gist run id 38aee85444712 2f021bc05e1e0de25ae https gist run id 38aee854447122f0
  • Webpack 在输出中禁用图像名称的散列

    构建我的 Angular 4 应用程序后 Webpack 将我的图像名称更改为bg node new png to bg node new 3746bc3ac9b1bf77d2aff2c2df901a48 png 我的 webpack co
  • TFS 2013:如何将变更集注释放入文本文件中?

    我想将所有变更集注释放入一个简单的文本文件中 以自动生成变更日志 我尝试通过在 SQL 中查询 TFS 表来做到这一点 但它是一个未记录的黑匣子 我读了一篇文章来运行这样的东西 tf history r 我获得了最新的 TFS 2013 电
  • 当Python请求库遇到重试限制时如何访问服务器响应

    我正在使用 Python requests 库来实现重试逻辑 这是我为重现我遇到的问题而制作的一个简单脚本 在重试次数用完的情况下 我希望能够记录来自服务器的至少一个响应以帮助调试 但是 我不清楚如何访问该信息 当然 我可以以其他方式实现重