2014-10-13 3 views
4

파이썬 "요청"모듈로 HTTP API를 요청하고 있습니다.Python "requests"모듈 응답 객체 수정하기

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']이 수정되지 않고 첫 번째 항목이 포함되어 있습니다.

그래서 파이썬 "요청"모듈이 "읽기 전용"객체의 왕을 생산하는지 궁금합니다. 아니면 뭔가를 놓친 것입니다.

답변

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재산이며, 그 아래에 아직 방법은 당신의 반환입니다 : 변수에 그 메서드 또는 속성의 결과를 저장 한 후 해당 업데이트 비행 중에 개체).

그렇지 않은 경우 Response 개체는 변경할 수 없습니다. 응답 본문 텍스트을 변경하여 result.json이 반환하는 내용을 변경해야하며, Response 개체가 응답 본문을 캐싱하는 방법에 대한 자세한 지식이 필요합니다. 그러면 특정 requests 버전으로 연결됩니다. 현재requests 시리즈 (2.4.x에서), 당신은 response._content 속성으로 교체 할 수 있습니다 들어

: 나는 result.content이 이미 존재한다는 가정을했습니다

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

(예는 스트리밍 응답이 이미 있습니다 이미 사용 된 경우), json_result은 이미 업데이트되었습니다.

다른 requests 버전에서 작동하는 경우; _content은 내부의 개인 속성입니다. 앞에 오는 밑줄은 공용 API의 일부가 아니므로 개발자가 해당 특성의 의미를 자유롭게 변경하거나 향후 릴리스에서 완전히 제거 할 수 있음을 나타냅니다.

+0

답장을 보내 주셔서 감사합니다.하지만이 작업을 수행하면 최종 개체가 더 이상 "응답"개체가 아니며 이것이 전제 조건입니다. – gr0bz

+1

@ gr0bz : 정확히 왜 그런가요? 파이썬 데이터 구조를 JSON 문자열로 다시 변환하고'Response' 객체를 업데이트해야합니다. 거의 강력한 솔루션. –