【发布时间】:2019-08-27 07:57:02
【问题描述】:
我正在运行一项作业,该作业发出许多从 API 检索数据的请求。为了发出请求,我使用了 requests 模块并对此代码进行了迭代:
logger.debug("Some log message")
response = requests.get(
url=self._url,
headers=self.headers,
auth=self.auth,
)
logger.debug("Some other log message")
这通常会产生以下日志:
[...] Some log message
[2019-08-27 03:00:57,201 - DEBUG - connectionpool.py:393] https://my.url.com:port "GET /some/important/endpoint?$skiptoken='12345' HTTP/1.1" 401 0
[2019-08-27 03:00:57,601 - DEBUG - connectionpool.py:393] https://my.url.com:port "GET /some/important/endpoint?$skiptoken='12345' HTTP/1.1" 200 951999
[...] Some other log message
然而,在极少数情况下,作业永远不会终止,并且在日志中显示:
[...] Some log message
[2019-08-27 03:00:57,201 - DEBUG - connectionpool.py:393] https://my.url.com:port "GET /some/important/endpoint?$skiptoken='12345' HTTP/1.1" 401 0
它从不打印剩余的日志消息并且从不返回。我无法重现该问题。我提出的请求从未手动返回,但它给了我想要的响应。
问题:
为什么
urllib3总是在打印状态代码为 200 的日志之前打印状态代码为 401 的日志?是否总是出现这种情况,还是由身份验证或 API 服务器的问题引起的?-
在第二个日志被截断的极少数情况下,我的假设是否正确,即应用程序卡在发出永远不会返回的请求?或者:
a)
requests.get是否会引发异常,从而导致其他日志语句永远不会被打印,然后“神奇地”在我的代码中的某个地方被捕获?b) 有没有我没有意识到的其他可能性?
附加信息:
Python 2.7.13(我们已经在升级到 Python3,但这需要在完成之前解决)
请求 2.21.0
urllib3 1.24.3
auth 是通过
requests.auth.HTTPDigestAuth(username, password)我的代码没有 try/except 块,这就是我在问题 2.a 中“神奇地”写的原因。这是因为我们更希望这项工作“大声”失败。
我正在迭代生成 url 的生成器以发出多个请求
作业由 Jenkins 2.95 按计划进行
当一切顺利运行时,它会在大约 5 分钟内发出大约 300 个请求
我正在运行两个 python 脚本,它们都运行相同的代码,但在一个作业中针对不同的端点但并行
更新
Q1的答案:
这似乎是 HTTP Digest Auth 的预期行为。 请参阅此github issue 和Wikipedia。
【问题讨论】:
标签: python python-2.7 python-requests urllib3