我正在使用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“请求”模块是否会产生一些“只读”对象的王者,或者我是否只是遗漏了某些东西。
答案 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的一部分,因此开发人员可以自由更改该属性的含义,或者在将来的版本中完全删除它。