gpt4 book ai didi

python - 为什么response.content可以被读取两次并且无法解码为json

转载 作者:行者123 更新时间:2023-12-01 04:32:12 25 4
gpt4 key购买 nike

我今天发现了一个奇怪的行为。我通过 python requests lib 在谷歌云消息传递中发送了一条消息。然后我尝试像这样解码对 json 的响应:

response = requests.post(Message_Broker.host, data=json.dumps(payload), headers=headers)
response_results = json.loads(response.content)["results"]

由于解码错误而崩溃:

response_results = json.loads(response.content)["results"]
File "/usr/local/lib/python2.7/dist-packages/simplejson/__init__.py", line 505, in loads
return _default_decoder.decode(s)
File "/usr/local/lib/python2.7/dist-packages/simplejson/decoder.py", line 370, in decode
obj, end = self.raw_decode(s)
File "/usr/local/lib/python2.7/dist-packages/simplejson/decoder.py", line 400, in raw_decode
return self.scan_once(s, idx=_w(s, idx).end())
JSONDecodeError: Expecting value: line 1 column 1 (char 0)

这发生在我的生产系统上,因此我添加了一些调试日志记录以了解响应的实际内容,如下所示:

        logger.info("GCM-Response: " + str(response))
logger.info("GCM-Response: " + response.content)
logger.info("GCM-Response: " + str(response.headers))

现在真正的奇怪行为发生了。它已正确记录并且不再抛出解码错误。

有人可以向我解释一下这种行为吗?

我还检查了response.content实际上是什么:

@property
def content(self):
"""Content of the response, in bytes."""

if self._content is False:
# Read the contents.
try:
if self._content_consumed:
raise RuntimeError(
'The content for this response was already consumed')

if self.status_code == 0:
self._content = None
else:
self._content = bytes().join(self.iter_content(CONTENT_CHUNK_SIZE)) or bytes()

except AttributeError:
self._content = None

self._content_consumed = True
# don't need to release the connection; that's been handled by urllib3
# since we exhausted the data.
return self._content

它是请求模型的一部分。不是实际的属性,但可以通过 @property 装饰器访问。据我了解,第一次读取内容进行日志记录时,_content_consumed 标志设置为 True。因此,第二次,当我读取它进行 json 解码时,它实际上应该引发运行时错误。

有没有解释,我在浏览请求文档时没有找到?

最佳答案

Therefore the second time, when I read it for the json decoding it should actually raise the Runtime Error.

不,它不会引发RuntimeError。当您第一次访问 response.content 时,它会将实际数据缓存到 self._content 中。在第二次(第三次、第四次等)访问时,if self._content is False: 为假,因此您将获得缓存在 self._content 中的内容。

if self._content_consumed: 检查很可能是内部断言,用于发现多次从套接字读取数据的尝试(这显然是一个错误)。

<小时/>

它无法解码为 JSON,因为您在响应正文中没有收到 JSON 或收到空正文。也许是 500 响应或 429。如果没有看到实际响应,就无法判断。

关于python - 为什么response.content可以被读取两次并且无法解码为json,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32226243/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com