修改Python"请求"模块响应对象

时间:2014-10-13 14:17:53

标签: python json dictionary

我正在使用Python“请求”模块请求HTTP API。

result = requests.get(api_url)

响应采用JSON格式,并包含一个“数据”键,它是一个字典。 出于某些原因,我必须在脚本中进一步提出第二个请求,并且我尝试使用第二个字典(result.json['data'])更新第一个字典(result2.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“请求”模块是否会产生一些“只读”对象的王者,或者我是否只是遗漏了某些东西。

1 个答案:

答案 0 :(得分:5)

result.json()方法(请求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属性,其下方仍然是一个动态返回对象的方法。 / p>

否则,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的一部分,因此开发人员可以自由更改该属性的含义,或者在将来的版本中完全删除它。