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

gr0*_*0bz 7 python json dictionary

我正在使用Python"请求"模块请求HTTP API.

result = requests.get(api_url)
Run Code Online (Sandbox Code Playgroud)

响应采用JSON格式,并包含一个"数据"键,它是一个字典.出于某些原因,我必须在脚本中进一步提出第二个请求,并且我正在尝试result.json['data']使用第二个(result2.json['data'])更新第一个字典().

我试过这个:

result.json['data'].update(result2.json['data'])
Run Code Online (Sandbox Code Playgroud)

还有这个:

for key,value in dict(result2.json['data']).iteritems():
    result.json['data'][key] = value
Run Code Online (Sandbox Code Playgroud)

但这些都没有奏效,最终result.json['data']没有修改,只包含第一项.

所以我想知道Python"请求"模块是否会产生一些"只读"对象的王者,或者我是否只是遗漏了一些东西.

Mar*_*ers 5

result.json()是一个方法(请求1.0及以上)或属性.将该方法或属性的结果存储在变量中,然后更新:

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

json_result['data'].update(result2.json()['data'])
Run Code Online (Sandbox Code Playgroud)

(在旧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)
Run Code Online (Sandbox Code Playgroud)

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

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