首页 > 解决方案 > 为什么 python 请求没有终止,为什么打印这些单独的日志?

问题描述

我正在运行一项作业,该作业发出许多请求以从 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

它永远不会打印剩余的日志消息,也永远不会返回。我无法重现该问题。我提出了从未手动返回的请求,但它给了我想要的响应。

问题:

  1. 为什么urllib3总是在打印状态码为 200 的日志之前打印状态码为 401 的日志?这种情况总是如此,还是由身份验证或 API 服务器的问题引起的?

  2. 在第二个日志被剪断的罕见情况下,我的假设是否正确,即应用程序卡在发出永远不会返回的请求?或者:

    a)是否会requests.get引发异常,导致其他日志语句永远不会被打印,然后“神奇地”在我的代码中的某个地方被捕获?

    b) 有没有我没有意识到的其他可能性?


附加信息:


更新

回答Q1

这似乎是 HTTP Digest Auth 的预期行为。请参阅此github 问题Wikipedia

标签: pythonpython-2.7python-requestsurllib3

解决方案


要回答您的问题, 1. 似乎是您的 API 的问题。确保您可以运行 curl 命令并查看?

curl -i https://my.url.com:port/some/important/endpoint?$skiptoken='12345'
  1. 它永远不会终止,可能是因为 API 没有响应。添加超时以避免这种阻塞。

    response = requests.get(url=self._url, headers=self.headers, auth=self.auth, timeout=60)

希望这对您的问题有所帮助。


推荐阅读