修改Python“requests”模块的响应对象

12

我正在使用Python的"requests"模块请求一个HTTP API。

result = requests.get(api_url)
响应以JSON格式返回,包含一个'data'键,它是一个字典。由于某些原因,我需要在脚本的进一步步骤中进行第二个请求,并尝试使用第二个字典(result2.json['data'])更新第一个字典(result.json['data'])。
我尝试了以下内容:
result.json['data'].update(result2.json['data'])

以及这个:

for key,value in dict(result2.json['data']).iteritems():
    result.json['data'][key] = value

但是这些方法都没有起作用,最终的 result.json['data'] 没有被修改,仅包含第一项。

因此我想知道Python的"Requests"模块是否生成了某种"只读"对象,或者我是否遗漏了什么。

1个回答

12

result.json() 要么是一个 方法(自 requests 1.0 版本起),要么是一个 属性。将该方法或属性的结果存储在变量中,然后更新该变量:

json_result = result.json()
# requests < 1.0: json_result = result.json

json_result['data'].update(result2.json()['data'])

在旧版本的 requests 中(1.0之前),result.json 是一个 属性,并且在其下面仍然是一个返回你的对象的方法。

否则,Response 对象不应被修改。您必须更改响应 正文文本 才能更改 result.json 返回的内容,并且这需要对 Response 对象如何缓存响应正文的详细了解。这将使您与特定的 requests 版本绑定。

对于当前的 requests 系列(2.4.x),您可以替换 response._content 属性:

result.encoding, result._content = 'utf8', json.dumps(json_result)

我假设result.content已经存在(例如:流响应已经被消耗),并且json_result已经被更新。

这是否适用于其他requests版本取决于;_content是一个内部的、私有的属性。前导下划线表示它不是公共API的一部分,因此开发人员可以自由地更改该属性的含义或在未来的版本中完全删除它。


谢谢您的回复,但如果我这样做,我的最终对象将不再是“响应”对象,而这对我来说是一个前提条件。 - gr0bz
1
@gr0bz:为什么会这样呢?你需要将Python数据结构转换回JSON字符串并更新“Response”对象。这几乎不是一个强大的解决方案。 - Martijn Pieters

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接